2014-10-13 6 views
9

मैं एक फ़ाइल आयात करने के लिए jboss के आराम-आसान मल्टीपार्ट प्रदाता का उपयोग कर रहा हूं। मैंने @MultipartForm के बारे में http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation पढ़ा क्योंकि मैं इसे अपने POJO के साथ बिल्कुल मैप कर सकता हूं।@MultipartForm मूल फ़ाइल नाम कैसे प्राप्त करें?

नीचे मेरी POJO

public class SoftwarePackageForm { 

    @FormParam("softwarePackage") 
    private File file; 

    private String contentDisposition; 

    public File getFile() { 
     return file; 
    } 

    public void setFile(File file) { 
     this.file = file; 
    } 

    public String getContentDisposition() { 
     return contentDisposition; 
    } 

    public void setContentDisposition(String contentDisposition) { 
     this.contentDisposition = contentDisposition; 
    } 
} 

तब मैं फ़ाइल वस्तु मिल गया और उसके निरपेक्ष पथ मुद्रित और यह प्रकार फ़ाइल की एक फ़ाइल नाम वापस लौटा है। एक्सटेंशन और अपलोड किया गया फ़ाइल नाम खो गया है। मेरा ग्राहक एक संग्रह फ़ाइल अपलोड करने की कोशिश कर रहा है (ज़िप, टैर, जेड)

मुझे इस जानकारी को सर्वर की तरफ चाहिए, ताकि मैं अन-संग्रह प्रोग्राम को सही तरीके से लागू कर सकूं।

मूल फ़ाइल नाम सामग्री-स्वभाव शीर्षलेख में सर्वर को भेजा जाता है।

मुझे यह जानकारी कैसे मिल सकती है? या कम से कम अपलोड फ़ाइल नाम और एक्सटेंशन के साथ फ़ाइल को सहेजने के लिए मैं jboss कैसे कह सकता हूं? क्या यह मेरे आवेदन से विन्यास योग्य है?

+0

क्या आप अपनी 'फ़ाइल' में '@PartType (" एप्लिकेशन/ज़िप ") जोड़ने का प्रयास कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं? पूरा पैकेज 'org.jboss.resteasy.annotations.providers.multipart.PartType' है। –

+0

@isim हाँ मैं कोशिश करूंगा। टैर और जेड फाइलों के लिए मूल्य क्या होगा? –

+0

@isim कोई उपयोग नहीं :(यह काम नहीं किया। मुझे समझ में नहीं आ रहा है कि लोग एपिस क्यों लपेटते हैं जब वे मूल एपिस प्रदान करने वाली सभी कार्यक्षमता प्रदान नहीं करते हैं। वे कहते हैं कि कुछ बेहतर किया जा सकता है, वे एपीआई प्रदान करते हैं, वे और अधिक पेश करते हैं समस्याएं और जब तक हम इसे जानते हैं, हम बंद कर दिए गए हैं। मैं इस पर लगभग 3 दिनों से काम कर रहा हूं और तंग आ गया हूं। –

उत्तर

10

इस one सहित Resteasy उदाहरण के लिए एक सा चारों ओर देख बाद, ऐसा लगता है जब @MultipartForm टिप्पणी के साथ एक POJO वर्ग का उपयोग कर मूल फ़ाइल नाम और विस्तार में जानकारी प्राप्त करने के लिए कोई रास्ता नहीं मौजूद है।

उदाहरण मैंने देखा है अब तक प्रस्तुत multiparts की "फाइल" भाग से Content-Disposition हैडर से फ़ाइल नाम को पुनः प्राप्त करने के लिए फार्म HTTP POST, जो अनिवार्य रूप, तरह दिखता है के माध्यम से डेटा:

Content-Disposition: form-data; name="file"; filename="your_file.zip" 
Content-Type: application/zip 

आप होगा इस फ़ाइल को इस हेडर को निकालने के लिए अपनी फ़ाइल अपलोड रीस्ट सर्विस क्लास को अपडेट करना होगा:

@POST 
@Path("/upload") 
@Consumes("multipart/form-data") 
public Response uploadFile(MultipartFormDataInput input) { 

    String fileName = ""; 
    Map<String, List<InputPart>> formParts = input.getFormDataMap(); 

    List<InputPart> inPart = formParts.get("file"); // "file" should match the name attribute of your HTML file input 
    for (InputPart inputPart : inPart) { 
    try { 
     // Retrieve headers, read the Content-Disposition header to obtain the original name of the file 
     MultivaluedMap<String, String> headers = inputPart.getHeaders(); 
     String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";"); 
     for (String name : contentDispositionHeader) { 
     if ((name.trim().startsWith("filename"))) { 
      String[] tmp = name.split("="); 
      fileName = tmp[1].trim().replaceAll("\"","");   
     } 
     } 

     // Handle the body of that part with an InputStream 
     InputStream istream = inputPart.getBody(InputStream.class,null); 

     /* ..etc.. */ 
     } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    String msgOutput = "Successfully uploaded file " + filename; 
    return Response.status(200).entity(msgOutput).build(); 
} 

आशा है कि इससे मदद मिलती है।

+0

हाँ, मैं इस दृष्टिकोण पर वापस आ गया हूं। मैंने अपने मंच में भी एक मुद्दा उठाया है, यहां तक ​​कि https : //issues.jboss.org/browse/RESTEASY-1115। आपके प्रयासों के लिए धन्यवाद। –

+0

अच्छा लगता है। क्या आप इस उत्तर को स्वीकार किए जाने के रूप में चिह्नित करने पर विचार करेंगे? :) धन्यवाद। –

2

आप @PartFilename का उपयोग कर सकते हैं लेकिन दुर्भाग्यवश यह वर्तमान में केवल फॉर्म लिखने के लिए उपयोग किया जाता है, फॉर्म नहीं पढ़ता: RESTEASY-1069

इस समस्या को ठीक करने के लिए आप MultipartFormDataInput को अपने संसाधन विधि के पैरामीटर के रूप में उपयोग कर सकते हैं।

0

ऐसा लगता है कि Isim सही है, लेकिन एक कामकाज है।

अपने फॉर्म में एक छिपा हुआ क्षेत्र बनाएं और चयनित फ़ाइल के नाम के साथ अपना मान अपडेट करें। जब फॉर्म जमा किया जाता है, तो फ़ाइल नाम @FormParam के रूप में जमा किया जाएगा।

यहां कुछ कोड है जो आपको चाहिए (jquery आवश्यक)।

<input id="the-file" type="file" name="file"> 
<input id="the-filename" type="hidden" name="filename"> 

<script> 
$('#the-file').on('change', function(e) { 
    var filename = $(this).val(); 
    var lastIndex = filename.lastIndexOf('\\'); 
    if (lastIndex < 0) { 
     lastIndex = filename.lastIndexOf('/'); 
    } 
    if (lastIndex >= 0) { 
     filename = filename.substring(lastIndex + 1); 
    } 
    $('#the-filename').val(filename); 
}); 
</script> 
संबंधित मुद्दे