2011-03-14 84 views
0

我可以看到這個代碼文件上傳和上傳的HttpClient項目和部分

DiskFileUpload fu = new DiskFileUpload(); 
     // If file size exceeds, a FileUploadException will be thrown 
     fu.setSizeMax(1000000); 

     List fileItems = fu.parseRequest(request); 
     Iterator itr = fileItems.iterator(); 

     while(itr.hasNext()) { 
      FileItem fi = (FileItem)itr.next(); 

      //Check if not form field so as to only handle the file inputs 
      //else condition handles the submit button input 
      if(!fi.isFormField()) { 
      System.out.println("nNAME: "+fi.getName()); 
      System.out.println("SIZE: "+fi.getSize()); 
      //System.out.println(fi.getOutputStream().toString()); 
      File fNew= new File(application.getRealPath("/"), fi.getName()); 

      System.out.println(fNew.getAbsolutePath()); 
      fi.write(fNew); 
      } 
      else { 
      System.out.println("Field ="+fi.getFieldName()); 
      } 
     } 

而且我想知道這是什麼代碼的一部分:

List fileItems = fu.parseRequest(request); 
      Iterator itr = fileItems.iterator(); 

...裝置的HttpClient?我應該上傳文件的部分或它是什麼意思?我想用我的桌面應用上傳視頻文件,但我不確定如何組織HttpClient。 請幫我理解。


客戶

import org.apache.http.params.CoreProtocolPNames; 
import org.apache.http.util.EntityUtils; 


public class PostFile { 
    public static void main(String[] args) throws Exception { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost("http://localhost:8080/uploadtest"); 
    File file = new File("C:\\file.flv"); 

    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile = new FileBody(file, "binary/octet-stream"); 
    mpEntity.addPart("userfile", cbFile); 


    httppost.setEntity(mpEntity); 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } 
    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } 

    httpclient.getConnectionManager().shutdown(); 
    } 
} 

服務器

public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    System.out.println("Content Type ="+request.getContentType()); 


    try { 
     DiskFileUpload fu = new DiskFileUpload(); 
     // If file size exceeds, a FileUploadException will be thrown 
     fu.setSizeMax(1000000); 

     List fileItems = fu.parseRequest(request); 
     Iterator itr = fileItems.iterator(); 

     while (itr.hasNext()) { 
     FileItem fi = (FileItem) itr.next(); 

     //Check if not form field so as to only handle the file inputs 
     //else condition handles the submit button input 
     if (!fi.isFormField()) { 
      System.out.println("nNAME: " + fi.getName()); 
      System.out.println("SIZE: " + fi.getSize()); 
      //System.out.println(fi.getOutputStream().toString()); 
      File fNew = new File("D:\\uploaded.flv"); 

      System.out.println(fNew.getAbsolutePath()); 
      fi.write(fNew); 
     } 
     else { 
      System.out.println("Field =" + fi.getFieldName()); 
     } 
     } 
    } 
    catch (Exception ex) { 
    } 


    } 

我要上傳的文件> = 1Gb的。我究竟做錯了什麼?

回答

0

不,你不必通過部分上傳文件。在你的表單中,你可以有多個「文件」類型的輸入字段。

List fileItems = fu.parseRequest(request); 

上述代碼返回請求中所有「文件」輸入字段的列表。所以,如果你有兩個文件字段,你會得到兩個FileItem及其內容。下一條語句:

Iterator itr = fileItems.iterator(); 

用於獲取迭代器並迭代剛剛從請求中提取的FileItem列表。請記住,每個FileItem對象都是您上傳的文件。

+0

謝謝你的評論 – user592704 2011-03-14 05:59:41

+0

毫米..這不是一個評論..這是一個答案。你有沒有得到你想要的東西? – 2011-03-14 06:01:30

+0

我想用HttpClient和FileUpload上傳視頻文件(> = 1Gb),但找不到真正有用的代碼示例。桌面 - > servlet文件上傳。這個任務是否有獨立的教程? – user592704 2011-03-14 06:04:06