在花了很多时间阅读文档和在互联网上搜索一些技巧之后,我最终决定创建一个 Stack OverFlow 帐户;看起来很绝望?哈哈,我们走吧。
编辑(2012 年 5 月 16 日):当我找到解决方案时(最终由我自己),我用正在运行的代码替换了旧代码。
我转到 /admin/lstimg (ListImage),它从我的数据库中获取图像 (URL) 记录集合。然后将集合设置为允许我使用 jsp 文件中的数据的属性。
注意:公共类 ListImageServlet 扩展HttpServlet并使用MultipartConfig进行注释。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
Collection images = ImageFacade.getIjc().findImageEntities();
request.setAttribute("images", images);
request.getRequestDispatcher("/adm/img/lstimg.jsp").forward(request, response);
}
catch (Exception ex)
{
Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, "Cannot retrieve the images.", ex);
}
}
在我的 jsp 中,有一个很大的表单(就像我的“图像”集合一样)。在这里,我使用“图像”集合中的数据。对于每个图像,第一列中是缩略图,第二列中是文件输入。我正在尝试通过此(单个)表单执行多个更新。
<form method="post" action="../admin/lstimg" enctype="multipart/form-data">
<table>
<thead>
<tr>
<th>Thumb</th>
<th>to update</th>
</tr>
</thead>
<tbody>
<c:forEach items="${images}" var="image">
<tr>
<td>
<img src="myURL" height="100"/>
</td>
<td>
<input type="file" name="${image.thumb}"/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<input type="submit" value="Proceed" />
</form>
我的第一个问题是:由于我需要新图像具有相同的“image.thumb”(这是密钥),我将文件输入名称设置为当前的“image.thumb”,但我想知道是否,我会在我的计算机上检索我的文件时遇到一些问题?因为我计算机上的文件有自己的路径/文件名,而我服务器上的文件有另一个路径/UUID(密钥)。
编辑(2012 年 5 月 16 日):由于 AWS 不要求提供文件路径(手动设置),因此没有问题。
表单的外观(Web 浏览器)
在我选择了我需要更新/更改的图像后,我单击提交按钮(继续)。
- 我得到所有零件(文件输入)并将它们存储在集合“allParts”中。
- 我检查“allParts”集合的每个部分,如果文件大小在 1b 和 10Mo 之间,则该部分被添加到“selectedParts”集合中。
- 在这里,我不知道该怎么做我想做的事……我所有的图像都托管在我的 Amazon S3 服务器中。我使用 Jets3t 工具包。对于第一次上传,我调用 buildPostForm 方法(如下),它会做所有事情。
S3Service.buildPostForm(String bucketName, String key, ProviderCredentials credentials, Date expiration, String[] conditions, String[] inputFields, String textInput, boolean isSecureHttp);
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
ImageCheck.initAS3(request);
ImageCheck.update(request, response);
}
catch (S3ServiceException ex)
{
Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
}
catch (ServiceException ex)
{
Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
}
catch (NoSuchAlgorithmException ex)
{
Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
}
catch (IllegalStateException ex)
{
Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
}
response.sendRedirect("../admin/lstimg");
}
我的第二个问题是:要通过 servlet 上传/更改文件,因为我使用自己的表单,我需要将文件设置为我的 S3Object,但我不知道我可以用我的“selectedParts”做什么?有没有办法将零件更改为文件?我必须使用 Part 以外的其他东西吗?
编辑(05/16/2012):我的解决方案
对不起我的英语不好。提前感谢您的建议,意见,答案。如果您对代码有任何疑问或需要更多信息,请不要犹豫。