FileUpload и HttpClient загружают элементы и части - PullRequest
0 голосов
/ 14 марта 2011

Я вижу этот код

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) {
    }


  }

Я хочу загрузить файлы> = 1 Гб.Что я делаю не так?

1 Ответ

0 голосов
/ 14 марта 2011

Нет, вам не нужно загружать файлы по частям. В вашей форме вы можете иметь несколько полей ввода типа «файл».

List fileItems = fu.parseRequest(request);

Приведенный выше код возвращает вам список всех полей ввода «file» в вашем запросе. Итак, если у вас есть два поля файла, вы получите два FileItem с его содержимым. Следующее утверждение:

Iterator itr = fileItems.iterator();

используется для получения итератора и итерации списка FileItem, который вы только что извлекли из вашего запроса. Помните, каждый объект FileItem - это файл, который вы загрузили.

...