2012-05-14 3 views
2

После многих часов, проведенных на чтение документации и поиск некоторых советов в Интернете, я, наконец, решил создать учетную запись Stack OverFlow; кажется отчаянным? Ха-ха, пойдем.Загрузка нескольких файлов Amazon S3 с использованием частей

EDIT (05/16/2012): Когда я нашел решение (наконец, я сам), я заменил свой старый код на свой текущий код.

Я иду в/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 есть большая форма (как моя коллекция «изображений»). Здесь я использую данные из коллекции «images». Для каждого изображения в первом столбце эскиз и во втором столбце ввод файла. Я пытаюсь выполнить несколько обновлений через эту (одну) форму.

<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 (ключ).

EDIT (05/16/2012): Поскольку AWS не запрашивает путь к файлу (для установки вручную), никаких проблем с этим.

Как форма выглядит (Web Browser)

После того как я выбрал образ (ы) мне нужно обновить/изменить, я нажимаю на кнопку Submit (Продолжить).

  1. Я получаю все части (входы файлов) и сохраняю их в коллекции «allParts».
  2. Я проверяю каждую часть коллекции «allParts», если размер файла находится между 1b и 10Mo, часть добавляется в коллекцию «selectedParts».
  3. Здесь я не знаю, как делать то, что я хочу ... Все мои изображения размещены на моем сервере Amazon S3. Я использую Jets3t Toolkit. Для первой загрузки я вызываю метод 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"); 
    } 

Мой второй вопрос: Чтобы загрузить/изменить файл через сервлет, как я использую свою собственную форму, мне нужно, чтобы установить файл в моем S3Object, но я не знаете, что я могу сделать с моими «избранными группами»? Есть ли способ изменить часть на файл? Должен ли я использовать что-то другое, чем Part?

EDIT (05/16/2012): My solution

Извините за мой английский. Спасибо заранее за ваши предложения, советы, ответы. Если у вас есть какие-либо вопросы относительно кода, или вам нужно еще немного, не стесняйтесь.

ответ

1

Я был настолько сосредоточен на S3Object#S3Object(java.io.File), что не понял, что могу использовать StorageObject#setDataInputStream.

Как я установил старое изображение Ключ к новому изображению Ключ, моя новая проблема - это веб-браузер, который хранит в кеше старое изображение. Я потратил много времени на это, думая, что моя функция работает неправильно, даже если я даже не знаю, где я мог бы сделать ошибку; но я пошел на свой AWS и проверил значение «Last Modified», которое было успешно обновлено. Я очистил свой кеш, и я понял, что все в порядке с самого начала.

Если это может помочь некоторым, я предоставляю функции, которые я сделал, которые позволяют изменять несколько 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); 
    } 
} 
0

Вот javadoc из Part.Название поля ввода доступно по номеру Part#getName().

String name = part.getName(); 

Содержимое загружаемого файла можно получить по адресу Part#getInputStream().

InputStream content = part.getInputStream(); 

Вы можете прочитать его и записать его в произвольной OutputStreamthe usual Java I/O way. Например, FileOutputStream. Однако я не уверен, что вам в конечном итоге нужно делать с File. Если ваша единственная цель - сохранить его в БД, просто сохраните InputStream непосредственно, а не сначала сохраните его на диске.

+0

Я уже пробовал это (вчера), но тогда я не знаю, что делать с моей IS/OS (наконец, получить «Файл»)? Я никогда не использовал это раньше ... Я много чего пробовал, но все не получилось. В моей базе данных есть только ключ S3Object, который позволяет легко получить мое изображение из моего AS3S. Как я уже сказал, все мои изображения (или будут, для новых) сохранены на моем сервере Amazon S3. Чтобы сохранить 'S3Object' в моей' S3Bucket', мне нужно «установить» файл. Вот почему мне это нужно. 'public S3Object (файл java.io.File) throws java.security.NoSuchAlgorithmException, java.io.IOException' – ltin

Смежные вопросы