问题描述
这是我的页面<formid="ab"action="student.do?method=addStudentForCardReader"method="post"enctype="multipart/form-data"><p>shangchuan<inputtype="file"id="up"name="up"></p><inputtype="submit"value="submit"></form>java代码InputStreamsis=request.getInputStream();System.out.println(sis.available());FileOutputStreamfos=newFileOutputStream("/tmp/2.jpg");byte[]b=newbyte[sis.available()];sis.read(b);for(inti=0;i<b.length;i++){System.out.println(b[i]);}fos.write(b);fos.flush();sis.close();fos.close();获取到的流大小始终为零,请帮忙解决下,在线等。。
解决方案
解决方案二:
FileOutputStreamfos=newFileOutputStream("/tmp/2.jpg");这句干嘛的?看不懂
解决方案三:
sis.available()这个应该打印0吧?byte[]设置为256,然后循环读,直到read()==-1就退出
解决方案四:
方法:availablepublicintavailable()throwsIOException返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。注意,有些InputStream的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。如果已经调用close()方法关闭了此输入流,那么此方法的子类实现可以选择抛出IOException。类InputStream的available方法总是返回0。此方法应该由子类重写。这是javaApi的解释,由此可以看出楼主用这个方法来分配缓冲区是不对的,因为总是0.可以这样来分配byte[]buff=newbyte[2048];
解决方案五:
+1引用3楼longxing8000的回复:
方法:availablepublicintavailable()throwsIOException返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。注意,有些InputStream的实现将返回流中的字节总数,但也有很多实现不会这样……
解决方案六:
引用3楼longxing8000的回复:
方法:availablepublicintavailable()throwsIOException返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。注意,有些InputStream的实现将返回流中的字节总数,但也有很多实现不会这……
+1
解决方案七:
上传一般都是先把提交的内容转化为file对象
解决方案八:
就算是使用缓冲区进行读取。你这样的做法仍然是不对的首先按照HTTP协议,上来应该要解析HTTP头然后在最后,才是数据区。
解决方案九:
引用7楼rainsilence的回复:
就算是使用缓冲区进行读取。你这样的做法仍然是不对的首先按照HTTP协议,上来应该要解析HTTP头然后在最后,才是数据区。
楼上说正确。使用对“multipart/form-data”类型的数据进行解析吧。