Uploadpurlnnection मल्टीपार्ट / फॉर्म-डेटा का उपयोग करके सरणी सूची अपलोड करें


11

मुझे Arraylistकिसी भी पुस्तकालय का उपयोग किए बिना सर्वर पर छवियों को अपलोड करने की आवश्यकता है । मैं Asynctaskसिंगल इमेज अपलोड करने के लिए उपयोग कर रहा हूं और यह बिलकुल भी काम नहीं कर रहा है। अब मुझे उपयोग करके किसी भी प्रकार की कई फ़ाइलों को अपलोड करने के लिए अपना कोड बदलने की आवश्यकता है, Arraylist<String>लेकिन मेरी समस्या मौजूदा कोड की FileinputStreamसरणी सूची का समर्थन नहीं करती है और मुझे नहीं पता कि Fileinputstreamसर्वर पर अपलोड सरणी सूची के बजाय क्या उपयोग करना है और मैं नहीं इसके लिए किसी भी पुस्तकालय का उपयोग करना चाहते हैं।

public class multipart_test extends AsyncTask<Void,Void,String> {
    Context context;
    String Images;
    public static final String TAG = "###Image Uploading###";


    public multipart_test(Context context,String Upload_Images) {
        this.context = context;
        this.Images = Upload_Images;

    }

    @Override
    protected String doInBackground(Void... params) {
        BufferedReader reader;
        String WebPath = null;
        try {
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1024 * 1024;
            //todo change URL as per client ( MOST IMPORTANT )
            URL url = new URL("10.0.0.1/uploadMultipart.php");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // Allow Inputs &amp; Outputs.
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setUseCaches(false);

            // Set HTTP method to POST.
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            FileInputStream fileInputStream;
            DataOutputStream outputStream;
            outputStream = new DataOutputStream(connection.getOutputStream());
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);

            outputStream.writeBytes("Content-Disposition: form-data; name=\"reference\""+ lineEnd);
            outputStream.writeBytes(lineEnd);
            //outputStream.writeBytes("my_refrence_text");
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);

            outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadFile\";filename=\"" + "profileImage" +"\"" + lineEnd);
            outputStream.writeBytes(lineEnd);

            //Dummy ArrayList for upload
            ArrayList<String> uploadFiles = new ArrayList<>();
            uploadFiles.add(Images);
            uploadFiles.add(Images);
            uploadFiles.add(Images);
            uploadFiles.add(Images);


            fileInputStream = new FileInputStream(uploadFiles); // NOT SUPPORTING ARRAYLIST HERE
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // Read file
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                outputStream.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                fileInputStream.close();
            }
            // Responses from the server (code and message)
            int serverResponseCode = connection.getResponseCode();
            String result = null;
            if (serverResponseCode == 200) {
                StringBuilder s_buffer = new StringBuilder();
                InputStream is = new BufferedInputStream(connection.getInputStream());
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String inputLine;
                while ((inputLine = br.readLine()) != null) {
                    s_buffer.append(inputLine);
                }
                result = s_buffer.toString();
            }
            connection.getInputStream().close();
            outputStream.flush();
            outputStream.close();
            if (result != null) {
                Log.d("result_for upload", result);
            }
            return WebPath;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


}

मैंने भी FileInputStreamलूप में डालने की कोशिश की, लेकिन कई अनुरोधों में चित्र अपलोड करना वह नहीं है जो मैं चाहता हूं। मेरे सर्वर को छवियों की संख्या के लिए एकल अनुरोध करने के लिए ऐप की आवश्यकता है। किसी भी मदद की सराहना की जाएगी, लेकिन किसी भी पुस्तकालय के उपयोग के बिना


Http कक्षाएं पदावनत हैं, रेट्रोफिट या अन्य लाइब्रेरी का उपयोग करें
जयप्रकाश सोनी

आप एक ही अनुरोध में रेट्रोफिट का उपयोग कर सकते हैं और कई छवियों को अपलोड कर सकते हैं
प्रियांकगब

जवाबों:


4

ध्यान दें कि मैंने कोशिश नहीं की है अगर यह कोड HttpURLConnection के साथ काम करता है, लेकिन यह होना चाहिए।

इंटरनेट से जो मैंने पढ़ा है, आप अभी भी उस लूप का उपयोग कर सकते हैं जिसका आपने उल्लेख किया है, लेकिन कुछ संशोधनों के साथ।

मैं पर ट्यूटोरियल का पालन किया बहुखण्डीय / फार्म-डेटा यहां dev.to एक सीखने के बाद के इस अधिक बनाने के लिए मैं आपको बताएंगे कि इस विधि क्या होना चाहिए है।

बहुखण्डीय / फार्म-डेटा इस तरह से भेजा जाता है

--boundary
Content-Disposition: form-data; name="something1"

data1
--boundary
Content-Disposition: form-data; name="something2"

data2
--boundary--

मैं एक नई विधि बनाने के लिए क्या करूंगा लेकिन आप अपने पहले से मौजूद तरीके से कोड लिख सकते हैं।

public byte[] get_multipart_data(List<String> files, String boundary)

आप लिखना चाहते हैं सीमा के बाद स्वभाव और फिर डेटा है । सभी फ़ाइलों के लिए ऐसा करें और फिर आप समापन सीमा भेजते हैं । यह आपके इच्छित मल्टीपार्ट / फॉर्म-डेटा संरचना को उत्पन्न करेगा ।

Psudo-code में यह होगा

loop for all files
    write "--boundary"
    write "Content-Disposition: ...."
    write image_data
end
write "--boundary--"

कोड इस तरह लिखा जा सकता है, पहले आप अपने चर को परिभाषित करें

ByteArrayOutputStream message = null;
DataOutputStream stream = null;

FileInputStream fileInputStream;

int maxBufferSize = 1024 * 1024;
byte[] buffer = new byte[maxBufferSize];
byte[] sendData = new byte[0];

यहां वह है जहां डेटा उत्पन्न होगा। यह सीमा को समाप्‍त करने और फिर डेटा पढ़ने के साथ शुरू होता है । वह डेटा स्ट्रीम को लिखा जाता है और आप सभी फाइलों / छवियों के लिए लूप जारी रखते हैं।

try {
    message = new ByteArrayOutputStream();
    stream = new DataOutputStream(message);

    // Loop though all file names
    for(String fileName : files) {
        stream.writeBytes("--" + boundary + "\r\n"); // Start boundary
        stream.writeBytes("Content-Disposition: form-data; name=\"" + fileName + "\"\r\n\r\n");

        // Read the image data
        fileInputStream = new FileInputStream(fileName);
        int readBytes = 0;
        while((readBytes = fileInputStream.read(buffer)) != -1) {
            // Write file data to output
            stream.write(buffer, 0, readBytes);
        }
        fileInputStream.close();

        stream.writeBytes("\r\n");
    }
    stream.writeBytes("--" + boundary + "--\r\n"); // Closing boundary

    sendData = message.toByteArray();
} catch(IOException e) {
    e.printStackTrace();
}

अब बाइट सरणी sendDataमें मल्टीपार्ट / फॉर्म-डेटा होगा जिसे आपको अपने HttpURLConnection के साथ भेजने की आवश्यकता है।

मैं लंबे समय से यहां सक्रिय नहीं हूं। मुझे बताएं कि क्या आपको कुछ और विनिर्देश की आवश्यकता है या यह कि मैं अपने पाठ को स्पष्ट करूं: डी


अगर मैं लूप चलाता हूं तो मुझे एरे अपलोड के लिए कई अनुरोध करने होंगे। मुझे एकल कॉल में सर्वर पर एक सरणी अपलोड करने की आवश्यकता है।
रितु

जो मैं समझता हूं कि आप एक ही HttpURLConnection कॉल में n चित्र सर्वर पर भेजना चाहते हैं। आप एक ज़िप प्रारूप का उपयोग करने का प्रयास कर सकते हैं जहां आप फ़ाइलों को इनपुट के साथ जोड़ सकते हैं अन्यथा मैंने जो लिखा है वह अभी भी केवल एक अनुरोध होगा। @ रितु
हार्डकॉन्ड

क्या आपके लिए यह संभव है कि आप अपने एसिंक्टस्क के बाहर लूप का उपयोग करें? । उदाहरण के लिए यदि आपके पास अपलोड करने के लिए 3 फ़ाइल है, तो आप 3 asynctask को स्वतंत्र रूप से निष्पादित करते हैं। इस तरीके से यदि कोई समस्या या समस्या एक छवि (अपलोड करने की प्रक्रिया) के लिए पाई जाती है, तो अन्य छवियां (प्रक्रियाएं) अपलोड करना जारी रखती हैं। प्रत्येक asynctask को आप समाप्त कर सकते हैं। अपनी कक्षा में एक काउंटर द्वारा गणना करें और यदि आवश्यक हो तो विलंब समय (अनुमानित समय) रखें (अपलोड करने में किसी समस्या के लिए चेतावनी के लिए)।
maniaq

1
@maniaq एक ही कार्य के लिए कई एसिंक्टस्क चलाने के लिए यह इष्टतम कोड नहीं है। हमें जहां कहीं भी नेटवर्क कॉल से बचना चाहिए।
androidXP

0

FileinputStream ArrayList का समर्थन नहीं करता है। लेकिन ObjectOutputStream का उपयोग करके एक तरीका है । यह आपके ArrayList को क्रमबद्ध भी करेगा। कोड में बदलाव देखें।

       //Changes required in your code
        ArrayList<String> uploadFiles = new ArrayList<>();
        uploadFiles.add(Images);
        uploadFiles.add(Images);
        uploadFiles.add(Images);
        uploadFiles.add(Images);

        fileInputStream = new FileInputStream("listImages"); 
        java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(fileInputStream); 
        oos.writeObject(uploadFiles);

        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];
        ...
        ...
        ...
        oos.close();

हैप्पी कोडिंग :)


0

सुनिश्चित नहीं है कि यदि एकल async कार्य का उपयोग करना आपके लिए आवश्यक है।

जैसा कि आपने कहा, आपका कोड सिंगल इमेज के लिए बिल्कुल ठीक काम करता है। तो आप अपने AsyncTask को थोड़ा संशोधित करने की जरूरत है कि सरणी सूची से कई फ़ाइलों को अपलोड करने के लिए। बस एक फ़ाइल को एक के बाद एक अपलोड करें या यदि आप भी ऐसा नहीं करना चाहते हैं तो बहुत अधिक संशोधन बस वैश्विक वैरिएबल को आइटम के सूचकांक को होल्ड करने की घोषणा करते हैं और OnPostExecute में async कार्य का नया उदाहरण बनाते हैं और अगले आइटम को सरणी सूची में पास करते हैं। आशा है कि यह स्पष्ट है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.