我有一个java servlet,它接受用户上传到我的网络应用程序的图像。
我有另一台服务器(运行php),它将托管所有图像。如何从我的jsp服务器获取图像到我的php服务器?流程将类似于:
public class ServletImgUpload extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// get image user submitted
// try sending it to my php server now
// return success or failure message back to user
}
}
由于
答案 0 :(得分:2)
我头顶的一些解决方案......
另外,请记住考虑将图像推送到servlet的频率。您不想尝试在内存中保存100个图像及其传输的网络套接字 - 在这种情况下将图像保存到磁盘。
答案 1 :(得分:0)
对于发送部分,您可以使用HttpClient之类的内容。您应该使用具有多部分“编码”的POST请求,并添加file parts。
由于您必须将其发送到PHP服务器,我建议您绕过servlet并将文件直接发送到PHP服务器,或者,如果不可能,只需将请求代理到PHP服务器。
答案 2 :(得分:0)
好吧,您可以在PHP服务器上设置一个简单的Web服务,该服务接受作为上传后的图像。
完成设置后,您可以使用HttpClient之类的内容通过帖子发送图片。
答案 3 :(得分:0)
首先,为什么不直接将表单提交给该PHP脚本?
<form action="http://example.com/upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
如果这不是一个选项,你真的需要将表单提交给servlet,那么首先在JSP中创建一个HTML表单如下:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
在监听url-pattern
/upload
的servlet中,您有2个选项来处理请求,具体取决于PHP脚本的用途。
如果PHP脚本采用相同的参数并且可以像HTML表单指示servlet一样处理上传的文件(我仍然宁愿让表单直接提交给PHP脚本,但无论如何),然后您可以让servlet播放透明代理,它只是立即将字节从HTTP请求传输到PHP脚本。 java.net.URLConnection
API在此非常有用。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpURLConnection connection = (HttpURLConnection) new URL("http://example.com/upload.php").openConnection();
connection.setDoOutput(true); // POST.
connection.setRequestProperty("Content-Type", request.getHeader("Content-Type")); // This one is important! You may want to check other request headers and copy it as well.
// Set streaming mode, else HttpURLConnection will buffer everything in Java's memory.
int contentLength = request.getContentLength();
if (contentLength > -1) {
connection.setFixedLengthStreamingMode(contentLength);
} else {
connection.setChunkedStreamingMode(1024);
}
InputStream input = request.getInputStream();
OutputStream output = connection.getOutputStream();
byte[] buffer = new byte[1024]; // Uses only 1KB of memory!
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
output.close();
InputStream phpResponse = connection.getInputStream(); // Calling getInputStream() is important, it's lazily executed!
// Do your thing with the PHP response.
}
如果PHP脚本采用不同的或更多参数(同样,我只是相应地改变HTML表单,以便它可以直接提交给PHP脚本),然后,您可以使用Apache Commons FileUpload提取上传的文件,Apache HttpComponents Client将上传的文件提交到PHP脚本,就像从HTML表单提交一样。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStream fileContent = null;
String fileContentType = null;
String fileName = null;
try {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField() && item.getFieldName().equals("file")) { // <input type="file" name="file">
fileContent = item.getInputStream();
fileContentType = item.getContentType();
fileName = FilenameUtils.getName(item.getName());
break; // If there are no other fields?
}
}
} catch (FileUploadException e) {
throw new ServletException("Parsing file upload failed.", e);
}
if (fileContent != null) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/upload.php");
MultipartEntity entity = new MultipartEntity();
entity.addPart("file", new InputStreamBody(fileContent, fileContentType, fileName));
httpPost.setEntity(entity);
HttpResponse phpResponse = httpClient.execute(httpPost);
// Do your thing with the PHP response.
}
}
答案 4 :(得分:0)
为什么要上传? 只需使用php file_get_contents()
下载该文件在文件接收上使用java来调用url之类的 http://php.example.com/getfile.php?file=file001.jpg
然后在PHP中getfile.php:
$ file = file_get_contents('http://java.example.com/images/file001.jpg');