You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何用C#提交无action属性的带文件输入表单?

Got it, let's figure out how to handle this scenario! When a form doesn't have an action attribute, its submission logic is almost always handled by client-side scripts (like JavaScript) instead of the browser's default form submission. Here's how you can replicate that in Unity with C#:

Step 1: Find the actual submission target and details

First, you need to uncover where the form data is being sent and how. There are two easy ways to do this:

  • Check the page's JavaScript: Look for event handlers tied to the form (like onsubmit) or the submit button (like onclick). You'll likely find code using fetch, XMLHttpRequest, or a framework method that defines the target URL, request method (POST/GET), and how data is formatted.
  • Use browser dev tools: Manually submit the form once while watching the Network tab in your browser's developer tools. This will show you the full request details: the target URL, request headers, and exactly what form data (including files) is being sent.

Step 2: Replicate the request in Unity

Once you have the target URL and data format, you can use Unity's UnityWebRequest (the modern replacement for WWW) to send the request. Here are two common scenarios:

Scenario 1: Form uses multipart/form-data (most common for file uploads)

If the browser's Network tab shows the request uses multipart/form-data (the default for forms with files), you can still use WWWForm to build your data:

using UnityEngine;
using UnityEngine.Networking;
using System.IO;
using System.Collections;

public class FormSubmitter : MonoBehaviour
{
    public void SubmitForm(string localFilePath, string userIdentifier)
    {
        StartCoroutine(SendMultipartForm(localFilePath, userIdentifier));
    }

    private IEnumerator SendMultipartForm(string filePath, string userId)
    {
        // Create the form and add fields/match the input names from the original form
        WWWForm form = new WWWForm();
        form.AddField("user_id", userId); // Match the name attribute of the text input

        // Add the file - use the same name as the file input in the original form
        byte[] fileBytes = File.ReadAllBytes(filePath);
        form.AddBinaryData("uploaded_file", fileBytes, Path.GetFileName(filePath), "application/octet-stream");

        // Replace this with the target URL you found earlier
        string targetUrl = "https://your-backend-url.com/submit-form";

        using (UnityWebRequest webRequest = UnityWebRequest.Post(targetUrl, form))
        {
            // Add any custom headers the original request used (found in Network tab)
            webRequest.SetRequestHeader("X-Requested-With", "XMLHttpRequest");

            yield return webRequest.SendWebRequest();

            if (webRequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"Submission failed: {webRequest.error}");
            }
            else
            {
                Debug.Log("Form submitted successfully!");
                Debug.Log($"Server response: {webRequest.downloadHandler.text}");
            }
        }
    }
}

Scenario 2: Form uses JSON format

If the original script sends data as JSON (you'll see Content-Type: application/json in the request headers), you'll need to format your data as JSON instead of using WWWForm:

using UnityEngine;
using UnityEngine.Networking;
using System.IO;
using System.Collections;
using System.Text;

public class JsonFormSubmitter : MonoBehaviour
{
    public void SubmitJsonForm(string localFilePath, string userIdentifier)
    {
        StartCoroutine(SendJsonForm(localFilePath, userIdentifier));
    }

    private IEnumerator SendJsonForm(string filePath, string userId)
    {
        // Convert file to base64 (common for JSON file uploads)
        string fileBase64 = Convert.ToBase64String(File.ReadAllBytes(filePath));

        // Create a data object matching the structure the backend expects
        FormData data = new FormData
        {
            user_id = userId,
            file = fileBase64,
            filename = Path.GetFileName(filePath)
        };

        // Serialize to JSON
        string jsonBody = JsonUtility.ToJson(data);
        byte[] bodyBytes = Encoding.UTF8.GetBytes(jsonBody);

        string targetUrl = "https://your-backend-url.com/submit-json";

        using (UnityWebRequest webRequest = UnityWebRequest.Post(targetUrl, string.Empty))
        {
            webRequest.uploadHandler = new UploadHandlerRaw(bodyBytes);
            webRequest.downloadHandler = new DownloadHandlerBuffer();
            webRequest.SetRequestHeader("Content-Type", "application/json");

            yield return webRequest.SendWebRequest();

            // Handle result same as before
            if (webRequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"Submission failed: {webRequest.error}");
            }
            else
            {
                Debug.Log("JSON form submitted successfully!");
            }
        }
    }

    // Helper class for JSON serialization
    [System.Serializable]
    private class FormData
    {
        public string user_id;
        public string file;
        public string filename;
    }
}

Key Notes

  • Always match the input names from the original form exactly—backend systems rely on these to parse data correctly.
  • Don't forget to add any custom request headers the original submission used (like authentication tokens or CSRF tokens).
  • On mobile, ensure you have the necessary permissions to read local files (e.g., READ_EXTERNAL_STORAGE on Android).

内容的提问来源于stack exchange,提问作者Vipin Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:52:19