7

Я использую playframework для создания веб-сайта. И я также использую богатый редактор с именем xheditor.Загрузка файла в playframework с различными браузерами

Xheditor поддерживает ajax-fileuploading, ему нужна сторона сервера, которая принимает параметр «filedata», который содержит файл для загрузки.

Так что я написал выгружать:

public class Application extends Controller { 
    public static void upload(File filedata) { 
     // the filedata should not be null 
     renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}"); 
    } 
} 

Он отлично работает в IE6, то FileData не является недействительным и содержит правильные данные. Но, если я использую хром или firefox, filedata - null !!

Я использую поджигатель контролировать то, что поджигатель представить, и нашел его представить такой заголовок:

content-disposition 
attachment; name="filedata"; filename="051111twdns.zip" 

Я думаю, что игра не обрабатывать этот случай правильно, поэтому параметр «FileData» равна нулю.

Для работы с хромом и светлячок, я изменил это действие:

public class Application extends Controller { 
    public static void upload(File filedata) { 
     if(filedata!=null) { 
      // ok, it's IE6 
      renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}"); 
     } else { 
      // it's chrome or firefox, the data is in request.body 
      File targetFile = new File("upload/test.zip"); 
      IOUtils.copy(request.body, new FileOutputStream(targetFile)); 
     } 
    } 
} 

Это работало в IE6, хром и Firefox теперь НО, только если загрузить файл очень мал. Например. менее 4K. Если он немного больше, например. 12K, метод «IOUtils.copy» сообщит «Read Error!», Даже следующий код будет сообщать такую ​​ошибку:

request.body.available() 
request.body.read() 
request.body.read(bytes) 

ответ

0

Вы должны взглянуть на класс play.data.parsing.ApacheMultipartParser, который управляет извлечением вложения файлов из HTTP-запроса.

Имя getFieldName получает имя заголовка поиска полей «content-disposition» и «form-data». В вашем случае его нет.

private String getFieldName(Map /* String, String */ headers) { 
    String fieldName = null; 
    String cd = getHeader(headers, CONTENT_DISPOSITION); 
    if (cd != null && cd.toLowerCase().startsWith(FORM_DATA)) { 

     ParameterParser parser = new ParameterParser(); 
     parser.setLowerCaseNames(true); 
     // Parameter parser can handle null input 
     Map params = parser.parse(cd, ';'); 
     fieldName = (String) params.get("name"); 
     if (fieldName != null) { 
      fieldName = fieldName.trim(); 
     } 
    } 
    return fieldName; 
} 

в GetFileName, он ищет заголовок «Content-Disposition», а затем «форм-данных» или «вложения», чтобы получить имя файла.

private String getFileName(Map /* String, String */ headers) { 
    String fileName = null; 
    String cd = getHeader(headers, CONTENT_DISPOSITION); 
    if (cd != null) { 
     String cdl = cd.toLowerCase(); 
     if (cdl.startsWith(FORM_DATA) || cdl.startsWith(ATTACHMENT)) { 
      ParameterParser parser = new ParameterParser(); 
      parser.setLowerCaseNames(true); 
      // Parameter parser can handle null input 
      Map params = parser.parse(cd, ';'); 
      if (params.containsKey("filename")) { 
       fileName = (String) params.get("filename"); 
       if (fileName != null) { 
        fileName = fileName.trim(); 
        // IE7 returning fullpath name (#300920) 
        if (fileName.indexOf('\\') != -1) { 
         fileName = fileName.substring(fileName.lastIndexOf('\\') + 1); 
        } 

       } else { 
        // Even if there is no value, the parameter is present, 
        // so we return an empty file name rather than no file 
        // name. 
        fileName = ""; 
       } 
      } 
     } 
    } 
    return fileName; 
} 

Таким образом, очевидно, в вашем случае, этот код будет найти имя файла, но не имя поля так, может быть, именно поэтому у вас есть поле FileData установлены в нуль в контроллере.

Почему это работает с IE6? (Потому что он никогда не был на самом деле стандарт, и делает что-то, что другие не делают больше ??? :))

Для получения дополнительной информации, в модуле Crud, то fileField.html объявляет загрузку файла следующим образом:

<input id="${field.id}" class="${field.errorClass}" type="file" name="${field.name}" /> 

Отношения

1

Попробуйте интегрировать ваш сайт с файлом пользователя, которые имеют LOF документации/образцов для разные языки www.uploadify.com/

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

  • Нет связанных вопросов^_^