3

GWTを使用してRESTWebサービスにファイルをアップロードしたい。しかし、これらの次のフィールドでnull値を取得しました。

InputStream uploadedInputStream, FormDataContentDisposition fileDetail

以下は私のGWTクライアントコードです

public void onModuleLoad() {
        Button button = new Button("Click Here");
        final FormPanel form = new FormPanel();
        final FileUpload fileUpload = new FileUpload();
        form.setMethod(FormPanel.METHOD_POST);
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        fileUpload.setName("upload");
        form.add(fileUpload);
        form.setAction("http://localhost:8080/RestWeb/webresources/generic/upload");
        RootPanel.get().add(form);
        RootPanel.get().add(button);
        button.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                System.out.println(fileUpload.getFilename());
                System.out.println(fileUpload.getName());
                System.out.println(fileUpload.getStyleName());
                fileUpload.setEnabled(true);

                System.out.println(form.getTarget());
                form.submit();
            }
        });
        form.addSubmitHandler(new SubmitHandler() {

            @Override
            public void onSubmit(SubmitEvent event) {
        Window.alert("Onsubmit");

            }
        });
        form.addSubmitCompleteHandler(new SubmitCompleteHandler() {

            @Override
            public void onSubmitComplete(SubmitCompleteEvent event) {
                Window.alert("OnsubmitComplete"+event.getResults());

            }
        });
    }
}

以下は私のサーバー側のコードです。クライアントとサーバー間の接続を取得しましたが、null値のみを取得しました。私は自分の間違いを理解していません。多くのサイトを参照していますが、同じコードを取得しました。

@Path("generic")
@WebService
public class GenericResource {

    @Context
    private UriInfo context;
    @Context
    private HttpServletResponse response;
    private String content = "content";

    /**
     * Creates a new instance of GenericResource
     */
    public GenericResource() {
    }
 @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)

    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {

        String uploadedFileLocation = "C://Users/SPC/Parvathy/upload" + fileDetail.getFileName();

        // save it
        writeToFile(uploadedInputStream, uploadedFileLocation);

        String output = "File uploaded to : " + uploadedFileLocation;

        return Response.status(200).entity(output).build();

    }

    // save uploaded file to new location
    private void writeToFile(InputStream uploadedInputStream,
            String uploadedFileLocation) {

        try {
            OutputStream out = new FileOutputStream(new File(
                    uploadedFileLocation));
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {

            e.printStackTrace();
        }
      }
    }

    public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
      //  if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            // CORS "pre-flight" request
                response.addHeader("Content-Type",
                "multipart/form-data");
            response.addHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8888");
            response.addHeader("Access-Control-Allow-Methods",  "PUT, GET, POST, DELETE, OPTIONS");
            response.addHeader("Access-Control-Allow-Headers","origin, access-control-allow-methods, content-type, access-control-allow-origin, access-control-allow-headers");
            response.addHeader("Access-Control-Max-Age", "1800");//30 min
       // }
        filterChain.doFilter(request, response);
      }
    }

私を助けてください。前もって感謝します。

4

3 に答える 3

1

これを試してみてください。GWTコードでは class. を使用しておりFileUpload、名前はupload. そのため、GWT は名前付きの入力フィールドを生成しuploadます (HTML ソースを確認して確認してください)。そのため、ブラウザーから送信すると、同じ名前のパラメーターとしてフィールドが送信されます。Webサービスでは、同じ名前のパラメーターをキャッチする必要があります..コードを次のように変更します

 public Response uploadFile(
            @FormDataParam("upload") InputStream uploadedInputStream,
            @FormDataParam("upload") FormDataContentDisposition fileDetail) {


 }
于 2013-01-12T05:09:18.230 に答える
0

このようなイベントベースのアプローチを試しましたか

于 2013-01-11T08:15:48.513 に答える
0

サーブレットを作成し、サーブレット マッピングを作成する必要があります。サーバーとの通信方法の詳細については、次のリンクを参照してください。

https://developers.google.com/web-toolkit/doc/1.6/DevGuideServerCommunication

于 2013-01-11T08:41:59.393 に答える