gpt4 book ai didi

java - 使用 Parts 的 Amazon S3 多文件上传

转载 作者:行者123 更新时间:2023-11-30 11:44:53 24 4
gpt4 key购买 nike

在阅读文档并在互联网上搜索一些技巧后,我最终决定创建一个 Stack OverFlow 帐户;看起来很绝望?哈哈,走吧。

编辑(2012 年 5 月 16 日):当我找到解决方案(最终由我自己找到)时,我用我正在运行的代码替换了我的旧代码。

我转到/admin/lstimg (ListImage),它从我的数据库中获取图像 (URL) 记录集合。然后将集合设置为一个属性,允许我使用我的 jsp 文件中的数据。

注意:公共(public)类 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( key )。

编辑(05/16/2012):由于 AWS 不要求文件路径(手动设置),因此没有问题。

表单的外观 ( Web Browser )

在我选择了我需要更新/更改的图像后,我单击“提交”按钮(继续)。

  1. 我获取所有部分(文件输入)并将它们存储在集合“allParts”中。
  2. 我检查“allParts”集合的每个部分,如果文件大小在 1b 到 10Mo 之间,则将该部分添加到“selectedParts”集合。
  3. 在这里,我不知道如何做我想做的事...我所有的图像都托管在我的 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 以外的东西吗?

编辑(2012 年 5 月 16 日):My solution

对不起我的英语。提前感谢您的建议、意见和答案。如果您对代码有任何疑问或需要更多信息,请不要犹豫。

最佳答案

我非常专注于S3Object#S3Object(java.io.File)我没有意识到我可以使用 StorageObject#setDataInputStream .

当我将旧图像 Key 设置为新图像 Key 时,我的新问题是网络浏览器会缓存旧图像。我在这上面花了很多时间,认为我的功能没有正确运行,即使我什至不知道我在哪里可能犯了错误;但我继续使用 AWS 并检查了已成功更新的“上次修改”值。我清除了缓存,发现从一开始就一切正常。

如果它可以帮助某些人,我提供了我所做的允许通过单个表单更改多个 S3Object 的功能。如果您有任何问题、建议或者您需要对该代码发表任何评论,请随时联系我。

public static void upload(HttpServletRequest request, Part part, S3Service s3Service, S3Bucket s3Bucket) 
throws S3ServiceException, NoSuchAlgorithmException, IOException
{
S3Object s3Object = new S3Object();
s3Object.setDataInputStream(part.getInputStream());
s3Object.setKey(part.getName());
s3Object.setContentLength(part.getSize());
s3Object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
s3Service.putObject(s3Bucket, s3Object);
}

public static void update(HttpServletRequest request)
throws S3ServiceException, ServiceException, NoSuchAlgorithmException, IOException, IllegalStateException, ServletException
{
AWSCredentials awsCredentials = (AWSCredentials) request.getSession().getAttribute("awsCredentials");
S3Service s3Service = (S3Service) request.getSession().getAttribute("s3Service");
S3Bucket s3Bucket = (S3Bucket) request.getSession().getAttribute("s3Bucket");
String bucketName = (String) request.getSession().getAttribute("bucketName");

String prefix = "uploads/";
String delimiter = null;
S3Object[] filteredObjects = s3Service.listObjects(bucketName, prefix, delimiter);

Collection<Part> allParts = request.getParts();
Collection<Part> selectedParts = new ArrayList<Part>();
Collection<String> keys = new ArrayList<String>();

for (Part part : allParts)
{
if (part.getSize()>1 && part.getSize()<10485760)
{
selectedParts.add(part);
}
}

for (int o = 0; o < filteredObjects.length; o++)
{
String keyObject = filteredObjects[o].getName();
keys.add(keyObject);
}

if (selectedParts.size() > 0)
{
for (Part part : selectedParts)
{
if (keys.contains(part.getName()))
{
s3Service.deleteObject(s3Bucket, part.getName());
upload(request, part, s3Service, s3Bucket);
}

else
{
selectedParts.remove(part);
}
}
}

else
{
String ex = "No file to update.";
exceptions.add(ex);
}
}

关于java - 使用 Parts 的 Amazon S3 多文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10576698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com