2009-02-13 13 views
40

के रूप में पोस्ट किया जाता है, मैं सर्वर पर एक फ़ाइल अपलोड कर रहा हूं। फ़ाइल अपलोड HTML फॉर्म में 2 फ़ील्ड हैं:यूटीएफ -8 टेक्स्ट को गड़बड़ कर दिया जाता है जब फॉर्म मल्टीपार्ट/फॉर्म-डेटा

  1. फ़ाइल का नाम - एक HTML टेक्स्ट बॉक्स जहां उपयोगकर्ता किसी भी भाषा में नाम दे सकता है।
  2. फ़ाइल अपलोड - एक HTMl 'फ़ाइल' जहां उपयोगकर्ता डिस्क से फ़ाइल को अपलोड करने के लिए निर्दिष्ट कर सकता है।

जब फॉर्म सबमिट किया गया है, तो फ़ाइल सामग्री ठीक से प्राप्त की जाती है। हालांकि, जब फ़ाइल का नाम (ऊपर बिंदु 1) पढ़ा जाता है, तो यह खराब होता है। ASCII वर्ण ठीक से प्रदर्शित होते हैं। जब नाम किसी अन्य भाषा (जर्मन, फ्रेंच इत्यादि) में दिया जाता है, तो समस्याएं होती हैं।

सर्वलेट विधि में, अनुरोध का वर्ण एन्कोडिंग यूटीएफ -8 पर सेट है। मैंने उल्लेख किए गए फ़िल्टर को करने का भी प्रयास किया - How can I make this code to submit a UTF-8 form textarea with jQuery/Ajax work? - लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। केवल फ़ाइल नाम को खराब किया जाना प्रतीत होता है।

MySQL तालिका जहां फ़ाइल नाम यूटीएफ -8 का समर्थन करता है। मैंने यादृच्छिक गैर-अंग्रेज़ी वर्ण & दिया है, वे ठीक से संग्रहीत/प्रदर्शित होते हैं।

फिडलर का उपयोग करके, मैंने & अनुरोध पर नजर रखी सभी पोस्ट डेटा सही ढंग से पारित हो गए हैं। मैं यह पहचानने की कोशिश कर रहा हूं कि डेटा कैसे/कहाँ गड़बड़ हो सकता है। किसी भी प्रकार की सहायता सराहनीय होगी।

+0

मुझे http://stackoverflow.com/questions/2422468/how-to-upload-files-to-server-using-jsp-servlet/2424824#2424824 - से विशिष्ट होने के लिए लाभ हुआ, यह '@ MultipartConfig' समाधान जो मेरे लिए काम करता है (मुझे 'नई स्ट्रिंग (.... getBytes (...), ...) के अलावा' इसके अलावा) की आवश्यकता है। दुर्भाग्यवश यहां सूचीबद्ध अन्य समाधान अकेले मेरे लिए काम नहीं करते:/ – Vin

उत्तर

48

मुझे अपाचे कॉमन्स-फ़ाइल अपलोड का उपयोग करने में एक ही समस्या थी। मुझे पता नहीं चला कि समस्याएं क्या कारण हैं क्योंकि विशेष रूप से मेरे पास निम्नलिखित स्थानों में यूटीएफ -8 एन्कोडिंग है: 1. एचटीएमएल मेटा टैग 2. फॉर्म स्वीकृति-वर्णसेट विशेषता 3. प्रत्येक अनुरोध पर टॉमकैट फ़िल्टर " UTF-8 "एन्कोडिंग

-> मेरे समाधान विशेष रूप से (या जो भी अपने मंच के डिफ़ॉल्ट एन्कोडिंग है) ISO-8859-1 से स्ट्रिंग्स कन्वर्ट करने के लिए UTF-8 में था:

new String (s.getBytes ("iso-8859-1"), "UTF-8"); 

आशा व्यक्त की कि मदद करता है

संपादित करें: जावा 8 से शुरू करना आप कर सकते हैं

new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); 
+0

माइकल, मैंने स्रोत कोड का संदर्भ दिया। MySQL का वर्ण एन्कोडिंग यूटीएफ -8 और पेज एन्कोडिंग विशेषता पर सेट है जो पहले ही जेएसपी में है। इसके अलावा, पॉल की स्वीकृति-वर्णसेट विशेषता के अनुसार फॉर्म टैग में सेट नहीं किया गया है। लेकिन किसी भी तरह ब्राउज़र यूटीएफ -8 डेटा नहीं भेजता है। फैक्स के सोलन ने काम किया। –

+0

क्या हो सकता है यदि कॉमन्स-फ़ाइल अपलोड ने इसे ठीक किया है और अनुरोध यूटीएफ -8 में है? शायद जब आप s.getBytes ("iso-8859-1") निष्पादित करते हैं तो बाइट आईएसओ -885 9 -1 एन्कोडिंग में नहीं होते हैं। –

+1

यह सुनिश्चित नहीं है कि इससे मदद मिलेगी, लेकिन यदि आप कोई अन्य मान कॉन्फ़िगर नहीं करते हैं तो कमांड-फ़ाइल अपलोड (कम से कम v1.2.1) प्लेटफ़ॉर्म एन्कोडिंग में डिफ़ॉल्ट रूप से तर्क है। 'Org.apache.commons.fileupload.FileUploadBase' और 'headerEncoding' फ़ील्ड' पर एक नज़र डालें। –

2

फ़िल्टर आईई के लिए महत्वपूर्ण है। जांच करने के लिए कुछ अन्य चीजें;

पृष्ठ एन्कोडिंग और वर्ण सेट क्या है? दोनों यूटीएफ -8

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

मेटा टैग में वर्ण सेट क्या है?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

क्या आपकी MySQL कनेक्शन स्ट्रिंग यूटीएफ -8 निर्दिष्ट करती है? उदा।

jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8 
0

फिल्टर बात है और एक HTTP GET के साथ जैसा कि आप का समर्थन करने के लिए यदि आप URL की क्वेरी स्ट्रिंग के माध्यम से गुजर रहे हैं UTF-8 यूआरआई केवल महत्वपूर्ण है बिलाव की स्थापना: भी निम्न का उपयोग करें। यदि आप HTTP संदेश के बॉडी में एक क्वेरी स्ट्रिंग के साथ POST का उपयोग कर रहे हैं, तो अनुरोध के सामग्री-प्रकार होने के लिए महत्वपूर्ण क्या है और यह सामग्री-प्रकार को यूटीएफ -8 पर सेट करने के लिए ब्राउज़र पर होगा और उस एन्कोडिंग के साथ सामग्री भेजें।

वास्तव में ऐसा करने का एकमात्र तरीका ब्राउज़र को बताकर है कि आप "यूटीएफ -8; क्यू = 1, आईएसओ -8859-1" के प्रत्येक प्रतिक्रिया पर स्वीकृति-वर्णसेट हेडर सेट करके केवल यूटीएफ -8 स्वीकार कर सकते हैं; q = 0.6 "। यह यूटीएफ -8 को सर्वोत्तम गुणवत्ता और डिफ़ॉल्ट वर्णसेट, आईएसओ -885 9 -1, स्वीकार्य के रूप में, लेकिन कम गुणवत्ता के रूप में रखेगा।

जब आप कहते हैं कि फ़ाइल का नाम खराब है, तो क्या यह HttpServletRequest.getParameter के वापसी मूल्य में खराब है?

-1

आप HTML फॉर्म के लिए टेक्स्ट डेटा एन्कोड करने के लिए यूटीएफ -8 का उपयोग नहीं करते हैं। एचटीएमएल मानक दो एन्कोडिंग को परिभाषित करता है, और the relevant part of that standard is here। एएससीआई को संभालने से "पुराना" एन्कोडिंग, एप्लिकेशन/एक्स-www-form-urlencoded है। नया, जो ठीक से काम करता है, मल्टीपार्ट/फॉर्म-डेटा है।

विशेष रूप से, प्रपत्र घोषणा इस तरह दिखता है:

<FORM action="http://server.com/cgi/handle" 
     enctype="multipart/form-data" 
     method="post"> 
    <P> 
    What is your name? <INPUT type="text" name="submit-name"><BR> 
    What files are you sending? <INPUT type="file" name="files"><BR> 
    <INPUT type="submit" value="Send"> <INPUT type="reset"> 
</FORM> 

और मुझे लगता है कि तुम सब के बारे में चिंता करने की ज़रूरत है - वेब सर्वर इसे संभाल चाहिए। यदि आप ऐसा कुछ लिख रहे हैं जो सीधे वेब क्लाइंट से इनपुटस्ट्रीम पढ़ता है, तो आपको RFC 2045 और RFC 2046 पढ़ने की आवश्यकता होगी।

9

मैं एक ही समस्या थी और यह पता चला कि फिल्टर में एन्कोडिंग को निर्दिष्ट करने के अलावा

request.setCharacterEncoding("UTF-8"); 
response.setCharacterEncoding("UTF-8"); 

यह फार्म के लिए "acceptcharset" जोड़ने के लिए आवश्यक है

<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" > 

और साथ JVM चलाने

-Dfile.encoding=UTF-8 

HTML मेटा टैग आवश्यक नहीं है अगर आप इसे HTTP हेडर में respond.setCharacterEncoding() का उपयोग करके भेजते हैं।

+4

मैं ग्लासफ़िश 3.1.1 का उपयोग कर रहा हूं, और '-Dfile.encoding = UTF-8' के साथ JVM चलाने के दौरान आवश्यक है, मुझे फ़िल्टर की आवश्यकता नहीं थी। ** हालांकि **, '

' टैग में 'स्वीकार्यसेट' विशेषता को जोड़ने से समस्या ठीक नहीं हुई। इसके बजाय, मुझे 'enctype' विशेषता में वर्णसेट पहचानकर्ता जोड़ना था, जैसा कि:' '। –

+2

-Dfile.encoding = UTF-8 पैरामीटर महत्वपूर्ण है। – Jasper

20

बस अपाचे कॉमन्स अपलोड लाइब्रेरी का उपयोग करें। URIEncoding="UTF-8" को टॉमकैट के कनेक्टर में जोड़ें, और FileItem.getString ("UTF-8") का उपयोग FileItem.getString() के बजाय निर्दिष्ट वर्णमाला के बिना करें।

इस सहायता की आशा करें।

+4

यह ऊपर उठाया जाना चाहिए, कुछ भी समस्या हल नहीं करता है ... फिल्टर और डोमेन/कंटेनर xml फ़ाइलों आदि के साथ भी कोशिश की .. getString ("UTF-8") कर रहा है भले ही सब कुछ नहीं किया जाता है ... –

+0

यह उत्तर समाधान है, इसे – solid

+1

वोट किया जाना चाहिए FileItem.getString ("UTF-8") मेरे लिए समाधान था – DLight

14

मैं इस समस्या के साथ अटक और पाया कि यह

request.setCharacterEncoding("UTF-8"); 

कि समस्या पैदा कर रहा था करने के लिए कॉल के आदेश था हो गया। इसे अनुरोध करने के लिए किसी भी कॉल से पहले बुलाया जाना चाहिए .getParameter(), इसलिए मैंने अपनी फ़िल्टर श्रृंखला के शीर्ष पर उपयोग करने के लिए एक विशेष फ़िल्टर बनाया।

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored

+0

इसे और अधिक उतारने की जरूरत है; मेरे लिए काम किया :) –

0

मैं glassfish और SQL सर्वर के साथ Primefaces उपयोग कर रहा हूँ।

मेरे मामले में

मैं बैक-एंड में WebFilter बनाया, हर अनुरोध मिलता है और UTF-8 में कनवर्ट करते हैं, इस तरह के:

package br.com.teste.filter; 

import java.io.IOException; 

import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 

@WebFilter(servletNames={"Faces Servlet"}) 
public class Filter implements javax.servlet.Filter { 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     request.setCharacterEncoding("UTF-8"); 
     chain.doFilter(request, response);  
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     // TODO Auto-generated method stub  
    } 

} 

देखें में (।एक्सएचटीएमएल) मैं @Kevin रेह की तरह UTF-8 में enctype paremeter के फार्म निर्धारित करने की आवश्यकता:

<h:form id="frmt" enctype="multipart/form-data;charset=UTF-8" > 
     <!-- your code here --> 
    </h:form> 
4

मामले में किसी को इस समस्या को जब Grails (या शुद्ध स्प्रिंग) वेब अनुप्रयोग पर काम कर रहा पर ठोकर खाई है, यहाँ पोस्ट है कि (स्प्रिंग डीएसएल)

http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms

UTF-8 (आईएसओ-8859-1 के बजाय) बहुखण्डीय अनुरोधों के लिए करने के लिए डिफ़ॉल्ट एन्कोडिंग सेट करने के लिए, मैं resources.groovy में निम्न कोड कहा:: मुझे मदद की

multipartResolver(ContentLengthAwareCommonsMultipartResolver) { 
    defaultEncoding = 'UTF-8' 
} 
+1

[वसंत संदर्भ में एक और सवाल] [http://stackoverflow.com/questions/9055025/how-to-change-the-character-encoding-for-servlet-3-0-spring- एमवीसी-मल्टीपार्ट-अपलोड), उन्होंने उल्लेख किया कि 'मल्टीपार्ट रीसोल्वर' में आईएसओ -885 9 -1 का डिफॉल्ट डिकोडिंग वर्ण है। आधिकारिक स्प्रिंग डॉक्स यहां देखें: [CommonsFileUploadSupport # setDefaultEncoding] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/commons/CommonsFileUploadSupport.html#setDefaultEncoding-java। lang.String-)। – easoncxz

1

मैं org.apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory) उपयोग कर रहा हूँ और एन्कोडिंग को परिभाषित जब पैरामीटर मान बाहर पढ़ने:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 

for (FileItem item : items) { 
    String fieldName = item.getFieldName(); 

    if (item.isFormField()) { 
     String fieldValue = item.getString("UTF-8"); // <-- HERE 
0

मैं एक ही समस्या थी। मेरे लिए काम करने वाला एकमात्र समाधान < संपत्ति = "डिफ़ॉल्ट एन्कोडिंग" मान = "यूटीएफ -8" > वसंत विन्यास फाइल में मल्टीपार्ट रेसोलर जोड़ने के लिए जोड़ रहा था।

संबंधित मुद्दे