Unity中用C#向SmartFile上传文件出现415错误求助
解决Unity上传文件时的415 Unsupported Media Type错误
嘿,这个415错误说白了就是服务器不认你发过去的数据格式,咱们来揪揪代码里的问题:
你当前的代码只是把文件路径字符串通过AddField当成普通表单字段传了过去,完全没把实际的文件内容(二进制数据)发给服务器。SmartFile这类文件上传服务需要的是文件本身的内容,而不是一个路径文本,服务器自然就返回“不支持的媒体类型”错误了。
正确的实现方式
要上传文件,你需要读取文件的二进制数据,然后用表单的二进制数据字段来提交。这里分两种写法,一种是兼容旧版Unity的WWW方式,另一种是官方推荐的UnityWebRequest方式:
方式1:使用WWW(旧版兼容)
WWWForm fileForm = new WWWForm(); string[] files = Directory.GetFiles(".", "*.txt"); // 先判断是否找到文件,避免数组越界 if (files.Length > 0) { // 读取目标文件的二进制内容 byte[] fileBytes = File.ReadAllBytes(files[0]); // 把二进制数据添加到表单,指定字段名、数据、文件名和MIME类型 fileForm.AddBinaryData( "file", fileBytes, Path.GetFileName(files[0]), "text/plain" // TXT文件对应的MIME类型 ); WWW www = new WWW("https://file.ac/xySSFOicMMk", fileForm); // 用协程等待上传完成(WWW是异步操作,不能直接同步等待) StartCoroutine(HandleUploadResult(www)); } // 处理上传结果的协程 IEnumerator HandleUploadResult(WWW www) { yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.LogError($"上传出错:{www.error}"); } else { Debug.Log($"上传成功,服务器返回:{www.text}"); } }
方式2:使用UnityWebRequest(官方推荐,替代WWW)
WWW在Unity 2017之后就被标记为弃用了,更推荐用UnityWebRequest来实现:
string[] files = Directory.GetFiles(".", "*.txt"); if (files.Length > 0) { byte[] fileBytes = File.ReadAllBytes(files[0]); string fileName = Path.GetFileName(files[0]); // 创建表单数据段 MultipartFormDataSection fileSection = new MultipartFormDataSection( "file", fileBytes, fileName, "text/plain" ); // 创建POST请求 UnityWebRequest uploadRequest = UnityWebRequest.Post( "https://file.ac/xySSFOicMMk", new List<IMultipartFormSection> { fileSection } ); // 发送请求并等待结果 yield return uploadRequest.SendWebRequest(); if (uploadRequest.result != UnityWebRequest.Result.Success) { Debug.LogError($"上传失败:{uploadRequest.error}"); } else { Debug.Log($"上传完成,服务器响应:{uploadRequest.downloadHandler.text}"); } }
关键要点总结
- 上传文件必须传递文件的二进制数据,而不是文件路径字符串
- 要设置正确的MIME类型(比如TXT文件用
text/plain,图片用image/png等),帮助服务器识别文件类型 - 异步操作必须用协程或者回调处理,不能直接同步阻塞主线程
内容的提问来源于stack exchange,提问作者Vipin Verma
相关产品推荐
相关产品推荐

