You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过jQuery向Java控制器上传多文件?Jersey Bug适配求助

Hey Endre, let's break down what's likely going wrong with your multi-file upload setup and fix it step by step. The "[object File]" issue usually points to a misstep in how you're constructing the request on the frontend, or a configuration gap on the Jersey backend. Here's what to check and adjust:

1. Fix the Frontend FormData Construction

The most common culprit here is not properly iterating over your file list and appending individual files to the FormData object. If you're just passing the entire files object directly, you'll end up with that "[object File]" string instead of actual file data.

Incorrect approach (what you might be doing):

const formData = new FormData();
formData.append('files', document.getElementById('fileInput').files); // Passes the FileList object, not individual files

Corrected JS code:

const fileInput = document.getElementById('fileInput');
const formData = new FormData();

// Iterate over each file in the input and append it
for (const file of fileInput.files) {
  formData.append('files', file); // 'files' is the parameter name your backend will look for
}

// Send the request - DON'T manually set Content-Type!
fetch('/your-upload-endpoint', {
  method: 'POST',
  body: formData
})
.then(response => response.text())
.catch(error => console.error('Upload failed:', error));

Important note: Never manually set the Content-Type to multipart/form-data here. Browsers automatically add the correct boundary identifier when you pass a FormData object, which Jersey needs to parse the request correctly.

2. Ensure Jersey Backend is Configured for Multipart

Jersey doesn't handle multipart requests out of the box—you need to add the right dependencies and register the required feature.

Add the Multipart Dependency

If you're using Maven, add this to your pom.xml (match the version to your Jersey installation):

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.41</version> <!-- Use your Jersey version -->
</dependency>

Register the MultipartFeature

You need to register MultipartFeature in your Jersey application configuration so it can process multipart/form-data requests:

import org.glassfish.jersey.media.multipart.MultipartFeature;
import javax.ws.rs.core.Application;
import java.util.Set;
import java.util.HashSet;

public class JerseyAppConfig extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(YourUploadController.class); // Your controller class
        classes.add(MultipartFeature.class); // Critical for multipart handling
        return classes;
    }
}

3. Correct Backend Controller Code

Make sure you're using the right annotations to receive multiple files. Use List<InputStream> to get the file content, and List<FormDataContentDisposition> to access file metadata (like the original filename).

Example Controller:

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataParam;
import java.io.InputStream;
import java.util.List;

@Path("/upload")
public class FileUploadController {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadMultipleFiles(
            @FormDataParam("files") List<InputStream> fileStreams,
            @FormDataParam("files") List<FormDataContentDisposition> fileDispositions) {

        // Check if files were received
        if (fileStreams == null || fileStreams.isEmpty()) {
            return Response.status(Response.Status.BAD_REQUEST)
                           .entity("No files were uploaded.")
                           .build();
        }

        // Process each file
        for (int i = 0; i < fileStreams.size(); i++) {
            InputStream fileStream = fileStreams.get(i);
            String originalFileName = fileDispositions.get(i).getFileName();
            
            // Handle the filename slash issue here:
            // Jersey might truncate slashes, so you can modify the filename as needed
            // Example: Replace slashes with underscores
            String safeFileName = originalFileName.replace("/", "_");
            
            // Write the file to disk or process it further...
            // Don't forget to close the stream when done!
        }

        return Response.ok("All files uploaded successfully.").build();
    }
}

Key point: The parameter name files in @FormDataParam must match exactly what you used in the frontend's formData.append('files', file) call.

4. Troubleshooting Additional Issues

  • Check Request Payload: Use your browser's DevTools (Network tab) to inspect the POST request. Ensure the Form Data section shows each file with the correct name and content.
  • Dependency Conflicts: If you're using an older Jersey version, make sure the multipart dependency version matches exactly to avoid compatibility issues.
  • File Size Limits: If you're uploading large files, you might need to configure Jersey's maximum file size settings in your web.xml or application config.

Once you fix these steps, your multi-file upload should start working, and you can then focus on adjusting the filename handling to work around the Jersey slash-truncation bug.

内容的提问来源于stack exchange,提问作者Pető Endre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:43:31