使用java中的azure函数将文件从浏览器上载到azure blob存储

使用java中的azure函数将文件从浏览器上载到azure blob存储,java,azure,azure-functions,azure-storage-blobs,Java,Azure,Azure Functions,Azure Storage Blobs,我正在尝试通过Azure功能将文件上载到Azure存储。我成功上传了纯文本文件,但是其他类型的文件都被破坏了。我观察到的是,我接收的字节小于实际大小(bodyLength> 我的要求是通过azure功能将大型文件上载到存储。任何帮助都将不胜感激。这似乎是因为您需要将原始流上载到blob storge。我以前上传时将其转换为byte[],但也失败了。我用C#遇到了和你一样的问题。 问题出在这里: String body = request.getBody().get(); InputStream

我正在尝试通过Azure功能将文件上载到Azure存储。我成功上传了纯文本文件,但是其他类型的文件都被破坏了。我观察到的是,我接收的字节小于实际大小(bodyLength 我试图将请求数据类型更改为 HttpRequestMessage<'Optional<'byte[]>>
我的要求是通过azure功能将大型文件上载到存储。任何帮助都将不胜感激。

这似乎是因为您需要将原始流上载到blob storge。我以前上传时将其转换为byte[],但也失败了。我用C#遇到了和你一样的问题。 问题出在这里:

String body = request.getBody().get(); 
InputStream inputStream = new ByteArrayInputStream(body.getBytes());
blob.upload(inputStream, Integer.parseInt(bodyLength));

在C#中,我使用
blob.UploadFromStreamAsync(req.Body)然后问题就消失了。您可以检查Java是否有类似的方法。

测试后,它是由请求头引起的。从中,您可以发现必须发送带有
多部分/表单数据的正文。如果没有标题,我将得到与你相同的结果

设置
内容类型
标题后,长度将相同

但是,即使长度相等,如果您发送的文件不是txt文件,而是pdf或图像等。Java Azure函数存在一个问题,即某些字节将丢失,这种情况与我在回答中提到的OP更新相同

因此,如果上载其他类型的文件,解决方案是将该文件转换为base64字符串,然后在函数中转换base64字符串,然后上载到blob

byte[] scanBytes = Base64.getDecoder().decode(base64 string from request);
blob.UploadFromByteArray(scanBytes , 0, scanBytes.Length);
节点:如果你想发布大文件,你应该知道有一个最大请求大小(100MB),这是无法更改的。但是在本地环境中,最大的声明是10MB~20MB,我测试本地出现这个限制。所以最好不要发布太大的文件

检查过了,但遗憾的是,没有任何帮助。文档太旧了,甚至有一些错误

通过本地测试,我发现azure java函数无法像预期的那样处理不同的内容,即使有时您设置了正确的内容类型头

在大多数情况下,它会将内容视为纯文本。在大多数情况下,如果没有不可读的特殊字符,那就没有问题了

然而,对于其他文件,例如:图像文件、二进制文件和其他可能包含不可读特殊字符的文件,Azure函数似乎只是忽略了一些不可读字符

要解决这个问题,您可以将请求内容类型头设置为
application/octet stream
,这意味着它是一种未知格式。这样,Azure函数将保留所有内容字节

然而,George的方法(使用多部分/表单数据)也可以起作用。因为如果内容类型是multipart/formdata,系统还将保留所有内容(这是诀窍),以便您可以使用定义的边界字符串获取每个部分。此方法的使用场景是以http形式上载文件。您只需将enctype设置为“多部分/表单数据”



因此,如果您只想通过编程将文件发布到Azure函数,请将内容类型设置为application/octet stream

我们在java中有blob.uploadFromByteArray(bytes,0,bytes.length)。但它不起作用。@user3407500,有什么程序吗?你能用我的功能上传文件吗?如果这能帮助你,请接受它作为答案。
String body = request.getBody().get(); 
InputStream inputStream = new ByteArrayInputStream(body.getBytes());
blob.upload(inputStream, Integer.parseInt(bodyLength));
byte[] scanBytes = Base64.getDecoder().decode(base64 string from request);
blob.UploadFromByteArray(scanBytes , 0, scanBytes.Length);
<FORM method="POST" action="....." enctype="multipart/form-data">
    <INPUT type="file" name="pic">
    <INPUT type="submit" value="submit" name="submit">
</FORM>