尝试将文件上传到我的servlet而不用ajax刷新页面。
现在已经坚持了好几天了,只是不能放手。
我的表格:
<form method="POST" id="changeImage2" enctype="multipart/form-data">
<input type="file" name="photo" /> <br>
<input type="button" value="Change Picture" id="changeImage1">
</form>
我的servlet:
@MultipartConfig
public class changeImage extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
Part filePart = req.getPart("photo");
Object email = req.getSession().getAttribute("email");
Object name = req.getSession().getAttribute("name");
try{
Class.forName("com.mysql.jdbc.Driver");
Connection myConn = DriverManager.getConnection("", "", "");
PreparedStatement ps = myConn.prepareStatement("update user set profilePicture=? where email=? and name=?");
ps.setBlob(1, filePart.getInputStream());
ps.setString(2, (String) email);
ps.setString(3, (String) name);
ps.executeUpdate();
} catch (Exception e){
e.printStackTrace();
}
}
}
我的ajax / jquery:
<script>
$(document).ready(function() {
$('#changeImage1').click(function() {
var dataForm = $('#changeImage2').serialize();
$.ajax({
type : 'POST',
url : 'changeImage',
data : dataForm,
success : function(data) {
$('#gg1').text(data);
},
error : function() {
$('#gg1').text("Fail");
},
});
});
});
</script>
运行时我收到错误:
SEVERE:servlet [changeImage]的Servlet.service()与上下文有关 路径[/ Event]引发了异常 [org.apache.tomcat.util.http.fileupload.FileUploadBase $ InvalidContentTypeException: 请求不包含multipart / form-data或 multipart / form-data stream,content type header为null] with root 原因 org.apache.tomcat.util.http.fileupload.FileUploadBase $ InvalidContentTypeException: 请求不包含multipart / form-data或 multipart / form-data流,内容类型标头为空
我尝试使用另一种形式,没有ajax / jquery:
<form action="changeImage" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Change Picture" />
</form>
有了它,它有效。所以我猜测JDBC和Servlet是正确的。并且我没有正确使用Ajax / Jquery。
答案 0 :(得分:2)
在你的代码中写道:
ps.setBlob(5, (Blob) InputStream);
根据javadoc对于PreparedStatement这个int,5是参数索引。由于错误说明你只有3个参数。
您需要将此更改为3吗? - 查看你的SQL语句我认为你可能已经忘记了你已经从某个地方复制并粘贴过,但还没有编辑它。
答案 1 :(得分:0)
这些行是问题,您不能将Part对象用作Blob或InputStream。那里应该发生强制转换异常。
Part filePart = req.getPart("photo");
Part InputStream = filePart; //this line is not needed at all
ps.setBlob(1, (Blob) InputStream);
尝试这样的事情
ps.setBlob(1, filePart.getInputStream());
或
ps.setBinaryStream(1, filePart.getInputStream());