【发布时间】:2019-01-03 21:50:37
【问题描述】:
我无法将文件上传到 Google 云存储桶。它是一个音频文件。如果我将文件内容转换为base64,则上传成功。但是在云桶方面,没有什么可以将其转换回二进制音频文件。它不会自动发生。 如果我将二进制字节写入请求流,它会超时。
我需要使用 .Net core 2.0 并使其与 Unity3D 一起使用。因此不能使用适用于 .Net 更高框架版本的客户端库。
string fileName = Path.GetFileName(strAudioFileName);
HttpWebRequest request = HttpWebRequest)WebRequest.Create("https://www.googleapis.com/upload/storage/v1/b/my-bucket/o?uploadType=media&name=" + fileName );
request.Method = "POST";
request.Headers["x-goog-project-id"] = "9999999999";
byte[] bFileContent = File.ReadAllBytes(strAudioFileName);
//string strFileContent = Convert.ToBase64String(File.ReadAllBytes(strAudioFileName));// upload works if i use this.
Debug.Log("File size: Binary Length" + bFileContent.Length);
request.ContentType = "application/octet-stream";
request.ContentLength = bFileContent.Length;
//request.ContentLength =strFileContent.Length; //Length if base64 is used.
if (m_Token != null)
{
request.Headers["Authorization"] = "Bearer " + m_Token;
}
StreamWriter RestReqstreamWriter = new StreamWriter(request.GetRequestStream());
RestReqstreamWriter.Write(File.ReadAllBytes(strAudioFileName));
RestReqstreamWriter.Flush();
var httpResponse = (HttpWebResponse)request.GetResponse();
问题: 1. 使用base64编码,有没有可以尝试自动转换为二进制的请求内容类型?
- 用不带base64的二进制文件上传,有什么办法吗?我这里的代码超时了。
提前致谢。
【问题讨论】:
-
1) 您的代码正在读取文件两次。 2)文件有多大? 3) 如果您对文件进行 base64 编码,则 Cloud Storage 中没有任何内容可以自动解码。该文件将保持 base64 编码。
-
感谢您的回复。文件只有 48 kB。使用 base64,它变成了大约 64 kB。我认为第一个 readallbytes 应该无关紧要,因为我没有进一步处理它。删除后也没有任何区别。但我怀疑 RestReqstreamWriter.Write(File.ReadAllBytes(strAudioFileName)); Write() 函数需要 char 而我需要它来获取字节。我没有找到任何替代品..
-
正如我所提到的,问题似乎来自 request.ContentLength = bFileContent.Length; 的不匹配。和 RestReqstreamWriter.Write(File.ReadAllBytes(strAudioFileName))。 Write () 需要'Char',bFileContent.Length 显示字节数...如果这是正确的分析,请提出建议。请求超时或返回“要写入更多字节”的错误 - 取决于我厌倦的代码调整..
标签: json unity3d google-cloud-platform google-cloud-storage