可能重复:
How to upload a file using Java HttpClient library working with PHP - strange problem
我正在尝试创建一个可以在网站上自动提交表单的脚本,其中包含两个字段:标题和描述以及我应该上传图像的文件输入。 最后几天我搜索了我在谷歌上找到的每一页,但我无法解决我的问题...... 我还需要发布一个cookie,我已经使用了:
connection.setRequestProperty("Cookie", cookie); //this worked
但我提交表单时遇到问题,首先我尝试使用HttpUrlConnection,但我无法弄明白,现在我正在尝试使用HttpClient解决我的问题 html表单如下所示:
<form action="submit.php" method="post" enctype="multipart/form-data">
<input type="text" name="title">
<input name="biguploadimage" type="file">
<textarea name="description"></textarea>
<input type="image" src="/images/submit-button.png">
</form>
我的图片位于d:/images/x.gif
请给我一个完整的代码,因为我是java的新手。
O,以及如何使用HttpClient创建cookie?
非常感谢您的建议!
答案 0 :(得分:1)
此网址可能会帮助您解决问题。这不是那么简单,否则我会在这里粘贴代码。 upload files in java
你也可以在这里查看这个问题 similar question on stackoverflow
答案 1 :(得分:0)
有一篇包含代码示例的好文章:http://www.theserverside.com/news/1365153/HttpClient-and-FileUpload
注意MultipartPostMethod。这将允许您在一个请求中发布文件和其他数据。 如何使用许多参数进行简单的POST:http://hc.apache.org/httpclient-3.x/methods/post.html
答案 2 :(得分:0)
我最近使用Spring Web MVC和Apache Commons FileUpload执行此操作:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
(...)
@RequestMapping(method = RequestMethod.POST)
public ModelAndView uploadFile(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView("view");
if (ServletFileUpload.isMultipartContent(request)) {
handleMultiPartContent(request);
}
return modelAndView;
}
private void handleMultiPartContent(HttpServletRequest request) {
ServletFileUpload upload = new ServletFileUpload();
upload.setFileSizeMax(2097152); // 2 Mb
try {
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
if (!item.isFormField()) {
File tempFile = saveFile(item);
// process the file
}
}
}
catch (FileUploadException e) {
LOG.debug("Error uploading file", e);
}
catch (IOException e) {
LOG.debug("Error uploading file", e);
}
}
private File saveFile(FileItemStream item) {
InputStream in = null;
OutputStream out = null;
try {
in = item.openStream();
File tmpFile = File.createTempFile("tmp_upload", null);
tmpFile.deleteOnExit();
out = new FileOutputStream(tmpFile);
long bytes = 0;
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
bytes += len;
}
LOG.debug(String.format("Saved %s bytes to %s ", bytes, tmpFile.getCanonicalPath()));
return tmpFile;
}
catch (IOException e) {
LOG.debug("Could not save file", e);
Throwable cause = e.getCause();
if (cause instanceof FileSizeLimitExceededException) {
LOG.debug("File too large", e);
}
else {
LOG.debug("Technical error", e);
}
return null;
}
finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
catch (IOException e) {
LOG.debug("Could not close stream", e);
}
}
}
这会将上传的文件保存到临时文件中。
如果您不需要对上传进行所有低级控制,则使用CommonsMultipartResolver会更简单:
<!-- Configure the multipart resolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2097152"/>
</bean>
jsp中的示例表单:
<form:form modelAttribute="myForm" method="post" enctype="multipart/form-data">
<form:input path="bean.uploadedFile" type="file"/>
</form>
bean中的uploadedDocument属于org.springframework.web.multipart.CommonsMultipartFile类型,可以在控制器中直接访问(multipartResolver会自动解析每个multipart-request)