0

Safari5.xのWebサイトファイルアップロード機能で問題が発生しました。

JQueryは通常、ファイルを正しいContent-Type(image / pngなど)が割り当てられたファイルとしてRESTサービスに送信しますが、Safari 5.xでは、「multipart/form-data」としてのみ送信できるようです。

ジャージーとRestEasyの両方を介してこれを受け入れるために新しいエンドポイントを追加しようとしましたが、成功しませんでした。

問題は、パラメータを決定するのに問題があることだと思います。何を試しても、415の応答が返ってくるようです。

クライアント(私は制御できません)によって送信される要求は次のようになります。注:これは単一のファイルですが、複数をサポートしているように見えます。

ヘッダ

Accept:application/json, text/javascript, */*; q=0.01
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary15QUDazCkPkvqWTQ
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

ペイロード

------WebKitFormBoundary15QUDazCkPkvqWTQ
Content-Disposition: form-data; name="files[]"; filename="myFile.png"
Content-Type: image/png


------WebKitFormBoundary15QUDazCkPkvqWTQ--

API側で次の両方を試しました。

ジャージー

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipart(FormDataMultiPart multiPart) throws IOException{ 

    List<FormDataBodyPart> fields = multiPart.getFields("files");        
    for(FormDataBodyPart field : fields){
        InputStream inputStream = field.getValueAs(InputStream.class);
    }

    // respond...
}

ゆっくり休んで

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipart(@MultipartForm UploadForm form) {

    System.out.println(form.getFile().length);
    System.out.println(form.getName());

    //respond...
}



public class UploadForm {

    private String name;
    private File file;  /// Have tried various Objects & Arrays here - all with no success;

    @FormParam("filename")
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @FormParam("files")
    public void setFile(File file) {
        this.file = file;
    }

    public File[] getFile() {
        return file;
    }
}

誰かが私が間違っていることを指摘してもらえますか?私はジャージーに固執することを望みますが、この時点でどんな実用的な解決策にも満足しています。

4

1 に答える 1

0

私はJerseyを使用していますが、@MultipartFormUploadFormフォームを使用しようとしたことはありません。

私のパラメータは:

@Context final HttpServletRequest request

あなたはそれをこのように使うことができます(しかしこれはあなたの使い方には少しやり過ぎかもしれません):

final ServletFileUpload upload = new ServletFileUpload();
final FileItemIterator iter = upload.getItemIterator(request);

 while (iter.hasNext()) {
        //You should have only one element, but you may have several as multipart content
        final FileItemStream item = iter.next();

        final String name = item.getFieldName();
        final InputStream stream = item.openStream();
        //... and here you've got your inputstream
}
于 2013-03-01T12:35:06.550 に答える