2016-07-19 74 views
-1

我在處理上載到服務器的映像時遇到問題。在網上查看,在我看來,我需要先從apache庫創建一個DiskFileItemFactory對象,然後創建一個ServletFileUpload對象。從那裏我遍歷所有表單項目,直到我點擊文件。然而,當我做formItems.iterator()的compliler抱怨將圖像上傳到Servlet,然後轉發到亞馬遜s3

- Iterator is a raw type. References to generic type Iterator<E> should be 
    parameterized 
    - The method iterator() is undefined for the type List 

我將如何去修復這個錯誤,並可能有人幫助我學習什麼,我做錯了嗎?我是Java Servlets的新手,但熟悉Java。下面是我的代碼。謝謝!

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     //doGet(request, response); 

     PrintWriter out = response.getWriter(); 

     AWSCredentials credentials = new BasicAWSCredentials("XXXX", "XXXX"); 

     AmazonS3 s3Client = new AmazonS3Client(credentials); 

     try { 

     out.println("Hello, THIS WORKED!!<br/>"); 

      boolean isMultipart = ServletFileUpload.isMultipartContent(request); 


      if (isMultipart) { 
        out.println("Multipart is true"); 

         response.setHeader("Access-Control-Allow-Origin", "*"); 
         response.setHeader("Access-Control-Allow-Methods", "POST"); 
         response.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
         response.setHeader("Access-Control-Max-Age", "86400"); 

         DiskFileItemFactory factory = new DiskFileItemFactory(); 
         factory.setSizeThreshold(THRESHOLD_SIZE); 

         ServletFileUpload upload = new ServletFileUpload(factory); 
         upload.setFileSizeMax(MAX_FILE_SIZE); 
         upload.setSizeMax(MAX_REQUEST_SIZE); 


         List formItems = (List) upload.parseRequest(request); 

/////COMPILER ERROR. It complains that the Iterator is a raw type. How Do I learn how to fix this? 
         Iterator iter = formItems.iterator(); 



         // iterates over form's fields to get UUID Value 
         while (iter.hasNext()) { 
          FileItem item = (FileItem) iter.next(); 
          ObjectMetadata om = new ObjectMetadata(); 
          om.setContentLength(item.getSize()); 

          try { 



          } catch (AmazonServiceException ase) { 
           out.println(ase.toString()); 

          } catch (AmazonClientException ace) { 


           out.println(ace.toString()); 
          } 


          s3Client.putObject("images", "TestImg.jpg", item.getInputStream(), om); 
          if (item.isFormField()) { 

          out.println(item.getString()); 

          } 
          // processes only fields that are not form fields 
          if (!item.isFormField()) { 
           // itemFile = item; 
          } 
         } 


//      
//     } 
//     

      } 


     } catch(Exception e) { 



      out.print(e.toString()); 

     } 



    } 

回答

0

我認爲你需要退後一步,並試圖解決這一步一步。暫時忘記所有AWS的東西,因爲您甚至沒有在代碼中與AWS進行交互。您需要先讓文件上傳工作,然後再擔心將文件複製到S3。要做到這一點,你需要弄清楚編譯器告訴你什麼。

讓我們看看這兩條線:

List formItems = (List) upload.parseRequest(request); 
Iterator iter = formItems.iterator(); 

看幾行了,我們看到uploadServletFileUpload一個實例。所以讓我們去the documentationServletFileUpload.parseRequest()。該文件表明,該方法的簽名:

public List<FileItem> parseRequest(HttpServletRequest request) 
          throws FileUploadException 

注意如何它不只是返回List對象,它實際上返回一個List<FileItem>對象。當你將它投射到(List)時,你就把這些信息扔掉了。因此,讓我們修改代碼,使用FileItem,雖然我們是在它,爲什麼不使用Java For-Each loop,而不是一個老派的Iterator像這樣:

List<FileItem> formItems = upload.parseRequest(request); 
for (FileItem item : formItems) { 
    ObjectMetadata om = new ObjectMetadata(); 
    om.setContentLength(item.getSize());