Discuss / Java / 以上实例使用curl客户端没有问题,但在浏览器中是无法演示的

以上实例使用curl客户端没有问题,但在浏览器中是无法演示的

Topic source

jorry有桥

#1 Created at ... [Delete] [Delete and Lock User]

因为 request.getInputStream()  获取的是浏览器中提交的整个表单,表单的类型为 multipart/form-data,所以,每个文件都对应一个 Part,

我们应该要获取的是Part中的二进制数据流,

------WebKitFormBoundaryh7GpHdBw5LnBcRvG
Content-Disposition: form-data; name="uploadFile"; filename="3.jpg"
Content-Type: image/jpeg      <-----------------这一节是不要的,否则每次提交,数据流的数据都不一样

????JFIF??C


		
%# , #&')*)-0-(0%()(??C



(((((((((((((((((((((((((((((((((((((((((((((((((((??{"????b
	!1Q"Aa?23BRqr?????#$7DSfu???'5Ub???&46ETdgt?%cv???CFV??We????????

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

multipart是一种很难处理的内容,需要引入第三方库解析,后端难搞前端也难搞,所以现在几乎不用了。

前端用js直接读文件流发过来就行,还能显示进度条。

jorry有桥

#3 Created at ... [Delete] [Delete and Lock User]

泪,研究了一天,放弃,使用multipart/form-data编码方式提交的文件数据(包括其它字段数据),规则有些不一样,非常像STMP协议中的Part(将表单中所有的项目都拆解为一个一个的Part),而且也是基于InputStream流来传输数据的(POST都是基于流来发送请求,指的就是body部分),如果在Filter中读取了InputStream或getReader,那么与Part相关的就全是失效的,跟踪源码,这东西是在connect中就已经写了解析代码(跟协议相关)。就目前原则上,我仍然实现不了浏览器端上传文件,能实现Filter校验的功能

想到了克隆,失败。。。。

想到了从Request源头重新初始化,Request的实现经历了2层代理,也够狠的,失败。。。。

jorry有桥

#4 Created at ... [Delete] [Delete and Lock User]

所以,不论怎么伪造Request,都无法恢复原状。。。

廖雪峰

#5 Created at ... [Delete] [Delete and Lock User]

Q:在现代浏览器中,如何使用js读取用户指定的文件内容?

GPT:现代浏览器中可以使用File API来读取用户指定的文件内容。

  1. 首先在html代码中添加一个文件选择框,例如:
<input type="file" id="fileInput">
  1. 然后在js代码中获取到选择的文件并读取文件内容,例如:
var fileInput = document.getElementById("fileInput");
fileInput.addEventListener("change", function() {
  var file = fileInput.files[0];
  var reader = new FileReader();
  reader.onload = function(event) {
    var content = event.target.result;
    // do something with the file content
  };
  reader.readAsText(file);
});

在这个例子中,通过FileReader来读取文件内容。在文件读取完成后,onload函数会被调用,通过event.target.result获取到文件内容。需要注意的是,FileReader对象有多种读取文件的方式,上面的代码演示了一种将文件读取为文本的方式(readAsText)。如果需要读取其他类型的文件或者以其他方式读取文件,可以查看FileReader对象的文档。

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

再去MDN查一下FileReader基本上就能写js上传文件内容了:

https://developer.mozilla.org/en-US/docs/Web/API/FileReader

jorry有桥

#7 Created at ... [Delete] [Delete and Lock User]

感谢,这个思路没问题,仍然从客户端入手,丢掉了Part与表单那些东西。不过,我是学习哈,我的重点放在了Java后端RequestWrapper上了,哈哈


  • 1

Reply