2017-03-20 13 views
0

現在、ファイルをローカルからディスクに保存するHTTP接続にファイルを読み込んでいます。正常に動作しています。ByteArrayOutputStreamをhttp経由で投稿する方法

しかし私は内部で働いている環境のため、ディスクからファイルを読み込むことはできません。むしろデータベースから取り出し、JavaコードのByteArrayOutputStreamに格納します。

ディスクからファイルを読み込むのではなく、ByteOutputArrayStreamを使用して、代わりにhttp接続に書き込む必要があります。

私はこれを行うための効率的な方法を必要とする - 私は私の現在のコード(bloew)を変更することができれば、それは大丈夫です - 私は、必要に応じてそれをすべて廃棄するつもりです...

 // This is the primary call from jsp 
     public String postServer(String[] args)throws Exception{ 
      System.out.println("******* HTTPTestJPO inside postServer"); 

      String requestURL = "http://MyServer:8080/TransferTest/UploadServlet"; 
      String charset = "UTF-8"; 
      String sTest=args[0]; 
      String sResponse=""; 

      System.out.println("******* HTTPTestJPO incoming file string sTest:"+sTest); 

      MultipartUtility multipart = new MultipartUtility(requestURL, charset); 
      StringTokenizer inFiles=new StringTokenizer(sTest,","); 
      while(inFiles.hasMoreTokens()){ 
       String tmpFileName=inFiles.nextToken(); 
       System.out.println("******* tokenized tmpFileName:"+tmpFileName); 
       File uploadFile1 = new File(tmpFileName); 
       try { 
        multipart.addFilePart("fileUpload", uploadFile1); 
       } catch (IOException ex) { 
        System.err.println("******* HTTPTestJPO EXCEPTION: "+ex); 
       } 
      } 

      sResponse = multipart.handleFinish(); 
      System.out.println("******* HTTPTestJPO SERVER REPLIED:"+sResponse); 
      return sResponse; 
     } 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    // Multipart utility 
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     /** 
     * This utility class provides an abstraction layer for sending multipart HTTP 
     * POST requests to a web server. 
     * @author www.codejava.net 
     * 
     */ 
     public class MultipartUtility { 
      private final String boundary; 
      private static final String LINE_FEED = "\r\n"; 
      private HttpURLConnection httpConn; 
      private String charset; 
      private OutputStream outputStream; 
      private PrintWriter writer; 

      /** 
      * This constructor initializes a new HTTP POST request with content type 
      * is set to multipart/form-data 
      * @param requestURL 
      * @param charset 
      * @throws IOException 
      */ 
      public MultipartUtility(String requestURL, String charset)throws IOException { 
       this.charset = charset; 

       // creates a unique boundary based on time stamp 
       boundary = "===" + System.currentTimeMillis() + "==="; 

       URL url = new URL(requestURL); 
       httpConn = (HttpURLConnection) url.openConnection(); 
       httpConn.setUseCaches(false); 
       httpConn.setDoOutput(true); // indicates POST method 
       httpConn.setDoInput(true); 
       httpConn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary); 
       //httpConn.setRequestProperty("User-Agent", "CodeJava Agent"); 
       //httpConn.setRequestProperty("Test", "Bonjour"); 
       outputStream = httpConn.getOutputStream(); 
       writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),true); 
      } 

      /** 
      * Adds a upload file section to the request 
      * @param fieldName name attribute in <input type="file" name="..." /> 
      * @param uploadFile a File to be uploaded 
      * @throws IOException 
      */ 

      public void addFilePart(String fieldName, File uploadFile)throws IOException { 
       String fileName = uploadFile.getName(); 
       writer.append("--" + boundary).append(LINE_FEED); 
       writer.append("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"").append(LINE_FEED); 
       writer.append("Content-Type: "+ URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED); 
       writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED); 
       writer.append(LINE_FEED); 
       writer.flush(); 

    // HOW CAN I MODIFY THIS TO SEND AN EXISTING BYTEARRAYOUTPUTSTREAM INSTEAD OF A DISK FILE?? 
       FileInputStream inputStream = new FileInputStream(uploadFile); 
       byte[] buffer = new byte[4096]; 
       int bytesRead = -1; 
       while ((bytesRead = inputStream.read(buffer)) != -1) { 
        outputStream.write(buffer, 0, bytesRead); 
       } 
       outputStream.flush(); 
       inputStream.close(); 

       writer.append(LINE_FEED); 
       writer.flush();  
      } 

      /** 
      * Completes the request and receives response from the server. 
      * @return a list of Strings as response in case the server returned 
      * status OK, otherwise an exception is thrown. 
      * @throws IOException 
      */ 
      private String handleFinish() throws IOException { 
       String sResponse = ""; 

       //close out the multipart send 
       writer.append(LINE_FEED).flush(); 
       writer.append("--" + boundary + "--").append(LINE_FEED); 
       writer.close(); 

       // checks server's status code first 
       int status = httpConn.getResponseCode(); 
       sResponse=Integer.toString(status); 
       System.out.println("******* HTTPTestJPO http response code:"+status); 
       // if (status == HttpURLConnection.HTTP_OK) { 
        // BufferedReader reader = new BufferedReader(new InputStreamReader(
          // httpConn.getInputStream())); 
        // String line = reader.readLine(); 
        // while ((line = reader.readLine()) != null) { 
         // sResponse+=line; 
        // } 
        // reader.close(); 
        httpConn.disconnect(); 
       // } else { 
        // throw new IOException("Server returned non-OK status: " + status); 
       // } 

       return sResponse; 
      } 
     } 
    } 

答えて

2

の内容

byteArrayOutputStream.writeTo(outputStream); 

別のオプション新しいInputStreamを作成するには、次のようになります:

これは次のようにByteArrayOutputStreamは、 writeToメソッドを使用して別のOutputStreamに書き込むことができます

しかし、toByteArrayを呼び出すと、バイト配列のコピーが作成されるため、より高価です。

+0

うわー、それは速かった - 私は今すぐ試してみて、報告して戻します。ありがとう。 – wayneh

+0

簡単な質問 - 受信側のデータは、元のストリームがFileInputStreamの場合と同じように扱われますか?つまり、ファイル名を含めてディスクに正しく保存されますか? – wayneh

+0

受信側はバイトがどこから来たのか分からないか、気にしません。 – dnault

関連する問題