Android中使用HttpPost实现数据与文件同时上传的功能

Android中使用HttpPost实现数据与文件同时上传的功能,第1张

第一步:编写一个Servlet,把接收到的HTTP信息保存在一个文件中,代码如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//获取输入流,是HTTP协议中的实体内容

ServletInputStream sis=request.getInputStream()

//缓冲区

byte buffer[]=new byte[1024]

FileOutputStream fos=new FileOutputStream("d://file.log")

int len=sis.read(buffer, 0, 1024)

//把流里的信息循环读入到file.log文件中

while( len!=-1 )

{

fos.write(buffer, 0, len)

len=sis.readLine(buffer, 0, 1024)

}

fos.close()

sis.close()

}

第二步:实现如下图1的的表单页面,生成一个注册表单,提交到Servlet中

详细的代码如下:

<form action="servlet/ReceiveFile" method="post" enctype="multipart/form-data">

第一个参数<input type="text" name="name1"/><br/>

第二个参数<input type="text" name="name2"/><br/>

第一个上传的文件<input type="file" name="file1"/><br/>

第二个上传的文件<input type="file" name="file2"/><br/>

<input type="submit" value="提交">

</form>

注意了,由于要上传附件,所以一定要设置enctype为multipart/form-data,才可以实现附件的上传。

第三步:填写完信息后按“提交”按钮后,在D盘下查找file.log文件用记事本打开,数据如下:

-----------------------------7d92221b604bc

Content-Disposition: form-dataname="name1"

hello

-----------------------------7d92221b604bc

Content-Disposition: form-dataname="name2"

world

-----------------------------7d92221b604bc

Content-Disposition: form-dataname="file1"filename="C:/2.GIF"

Content-Type: image/gif

GIF89a

如图,RequestBody 有好几个 create 方法,可以满足不同场景下的内容上传,比如字符串、字节数组和文件。

显然,字符串和字节数组是不能上传大文件的,均可能 OOM。

那么,就只能使用 RequestBody create(MediaType contentType, File file) 方法了。正常情况下也是没什么问题的,但是在 Android Q 上,由于存储权限的变更,将导致无法直接访问从内容库所选择的文件。

得到如下日志:

可见,即使通过 uri 得到了文件的真实路径,也是无法直接访问的。

通过上面的实验可以看到,我们是无法直接通过 File 相关的 API 访问原始文件的,但是我们却可以通过 ContentResolver 得到原始文件的流。

类似地,可以基于流或者 FileDescriptor 对图片解码成 Bitmap,参考:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11485702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存