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,参考:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)