2017-01-21 14 views
6

bạn có thể giải thích lý do tại sao máy khách Android phân tích dữ liệu đa hình thành không phải trò chuyện ascii. trong khi tập tin tải lên làm việc tốt bằng người đưa thư đây là mãdữ liệu biểu mẫu phân tích nhiều khách hàng trên Android không phải là ascii

var multipart = require('connect-multiparty'); 
var apiRoutes = require('./routes/apiRoutes'); 
app.set('views', path.join(__dirname, 'views')); 
app.use(logger('dev')); 
app.use(bodyParser.json({limit: '50mb'})); 
app.use(bodyParser.urlencoded([{extended: false},{ uploadDir:path.join(__dirname, 'uploads') }, {parameterLimit:100000}, {limit: '50mb'}])); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'uploads'))); 
app.use(multipart()); 
app.use(apiRoutes); 

và apiRoutes chỉ chức năng tải lên của tôi chứa đơn giản in req param.using đưa thư cho nó hoạt động tốt đáp ứng

console.log("mediaChat called", req.body, req.files); 

app.js tôi

mediaChat called { apiKey: '123' } { media: 
    { fieldName: 'media', 
    originalFilename: 'default.png', 
    path: '/tmp/KFnwsKGp-f4woTaBH6aPR-qa.png', 
    headers: 
     { 'content-disposition': 'form-data; name="media"; filename="default.png"', 
     'content-type': 'image/png' }, 
    size: 716, 
    name: 'default.png', 
    type: 'image/png' } } 

đây là mã máy khách Android của tôi (Lưu ý mã này làm việc với tệp php $ _FILE nhưng không hoạt động với tốc độ nhanh)

com.info.acruss.wave; 

import android.os.AsyncTask; 
import android.util.Log; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

/** 
* Created by Naitik on 9/20/2016. 
*/ 
public class UploadImage extends AsyncTask<Void, Void, String> { 
    String CallingURL; 
    URL url; 
    OnTaskCompleted myListener; 
    private static final String TAG = "UploadImage"; 
    int timeoutMilli = 60000; 
    String sourceFileUri; 
    String ApiKey,Type; 

    public UploadImage(String sourceFileUri, String URL,String apiKey, String type, 
         OnTaskCompleted listener) { 
     Log.e("Uploading", "API:" + URL); 
     this.sourceFileUri = sourceFileUri; 
     this.CallingURL = URL; 
     this.myListener = listener; 
     this.ApiKey=apiKey; 
     this.Type=type; 
     try { 
      url = new URL(CallingURL); 
      Log.e(TAG, "Url : " + CallingURL); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     String fileName = sourceFileUri; 
     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 10 * 1024 * 1024; 
     File sourceFile = new File(sourceFileUri); 
     if (!sourceFile.isFile()) { 
      Log.e("UploadImage", "Source File Does not exist"; 
      return null; 
     } 
     String serverResponseMessage = ""; 
     try { 

      // open a URL connection to the Servlet 
      FileInputStream fileInputStream = new FileInputStream(sourceFile); 
      URL url = new URL(CallingURL); 
      // Open a HTTP connection to the URL 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setDoInput(true); // Allow Inputs 
      conn.setDoOutput(true); // Allow Outputs 
      conn.setUseCaches(false); // Don't use a Cached Copy 
      conn.setRequestMethod("POST"; 
      conn.setReadTimeout(timeoutMilli); 
      conn.setConnectTimeout(timeoutMilli); 
      conn.setRequestProperty("Connection", "Keep-Alive"; 
      conn.setRequestProperty("ENCTYPE", "multipart/form-data"; 
      conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
      conn.setRequestProperty("media", fileName); 
      conn.setRequestProperty("apiKey",ApiKey); 
      conn.setRequestProperty("media_type",Type); 
      conn.setRequestProperty("media", fileName); 

      dos = new DataOutputStream(conn.getOutputStream()); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name='media';filename='" + fileName + "'" + lineEnd); 
       dos.writeBytes(lineEnd); 
      // create a buffer of maximum size 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      buffer = new byte[bufferSize]; 

      // read file and write it into form... 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      while (bytesRead > 0) { 

       dos.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      } 

      // send multipart form data necesssary after file data... 
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

      // Responses from the server (code and message) 
      int serverResponseCode = conn.getResponseCode(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      String line = ""; 
      StringBuilder responseOutput = new StringBuilder(); 
      while ((line = br.readLine()) != null) { 
       responseOutput.append(line); 
      } 
      br.close(); 
      serverResponseMessage = responseOutput.toString();//output.toString(); 

      Log.e("uploadFile", "HTTP Response is : " + serverResponseMessage); 
      if (serverResponseCode == 200) { 
       //status code 200 
       //status ok 
      } 
      //close the streams // 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 

     } catch (MalformedURLException ex) { 
      ex.printStackTrace(); 
      Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
     } catch (Exception e) { 
      Log.e("Upload file to server", "error: " + e.getMessage(), e); 
      e.printStackTrace(); 
     } 
     return serverResponseMessage; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     Log.e("Result", "" + result); 
     if (myListener != null) 
      if (result != null) { 
       myListener.onFileUploadComplete(result); 
      } else { 
       myListener.onFileUploadComplete(""; 
      } 
    } 

    public interface OnTaskCompleted { 
     void onFileUploadComplete(String result); 
    } 
} 

sử dụng android chương trình này phản ứng dây như sau

 

mediaChat called { null: '����\u0000\u0010JFIF\u0000\u0001\u0001\u0000\u0000\u0001\u0000\u0001\u0000\u0000��\u0000C\u0000\u0010\u000b\f\u000e\f\n\u0010\u000e\r\u000e\u0012\u0011\u0010\u0013\u0018(\u001a\u0018\u0016\u0016\u00181#%\u001d(:3=Mqypdx\\egc��\u0000C\u0001\u0011\u0012\u0012\u0018\u0015\u0018/\u001a\u001a/cB8Bccccccccccc.... 
�\u001f.[���_�\u0014)M���XIjX��7�`=�/�8`��ïDʚ\u0018�D���#�V#q~m�q10L�' } 

tôi cũng đã cố gắng multer và xử lý nhiều phần dữ liệu khác, nhưng công trình ghi nhận. hãy giúp tôi thoát khỏi địa ngục này

+0

Có thể đó là hữu ích https://github.com/koush/ion –

Trả lời

2

Dường như phản hồi của máy chủ được mã hóa dưới dạng UTF-8. Để giải mã đúng và đọc bạn có thể thử

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 

Xác định phần mã hóa với InputStreamReader sẽ giải mã và đọc những dòng sử dụng lược đồ mã hóa quy định, trong trường hợp này là UTF-8. Kiểm tra các chi tiết javadocs.

0

Bạn cần phải phân bổ đệm một lần nữa dựa trên kích thước mới của bufferSize, tôi đã sửa đổi vào mã bên dưới:

// create a buffer of maximum size 
bytesAvailable = fileInputStream.available(); 
bufferSize = Math.min(bytesAvailable, maxBufferSize); 
buffer = new byte[bufferSize]; 

// read file and write it into form... 
bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

while (bytesRead > 0) { 

    dos.write(buffer, 0, bufferSize); 
    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 

    buffer = null; 
    buffer = new byte[bufferSize]; 

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

} 
+0

rõ ràng nó là một vấn đề về mã hóa và không đáp ứng một phần đọc từ máy chủ. đây là một sửa chữa không phù hợp –

0

dạng Multipart trình mất đi rất nhiều sự mơ hồ rằng phần trăm mã hóa có: máy chủ bây giờ có thể yêu cầu một cách rõ ràng các mã hóa nhất định và khách hàng có thể nói rõ ràng cho máy chủ trong quá trình gửi biểu mẫu mã hóa trường nào.

Có hai cách bạn thực hiện với chức năng này: để nó không được đặt và gửi trình duyệt mã hóa giống như trang hoặc đặt nó thành UTF-8 và sau đó thực hiện một trình chuyển đổi khác sion phía máy chủ. Mỗi phương pháp đều thiếu sót, đặc biệt là phương pháp cũ.

Nếu bạn yêu cầu trình duyệt gửi biểu mẫu trong cùng một mã hóa như trang, bạn vẫn gặp sự cố phải làm với các ký tự nằm ngoài phạm vi mã hóa ký tự. Các hành vi, một lần nữa, thay đổi: Firefox 2.0 chuyển đổi chúng thành các tham chiếu thực thể ký tự trong khi Internet Explorer 7.0 mang chúng đến mức không thể hiểu được. Đối với các mục đích quốc tế hóa nghiêm trọng, đây không phải là một lựa chọn.

Khả năng khác là đặt Accept-Encoding thành UTF-8, điều này đặt ra câu hỏi: Tại sao bạn không sử dụng UTF-8 cho mọi thứ? Tuyến đường này ngon miệng hơn, nhưng có một cảnh báo đáng chú ý: dữ liệu của bạn sẽ có dạng UTF-8, vì vậy bạn sẽ phải chuyển đổi nó một cách rõ ràng thành mã hóa ký tự địa phương được ưu tiên của bạn.

Mã hóa dựa trên Unicode như UTF-8 có thể hỗ trợ nhiều ngôn ngữ và có thể chứa các trang và biểu mẫu trong bất kỳ hỗn hợp nào của các ngôn ngữ đó. Việc sử dụng nó cũng loại bỏ sự cần thiết cho logic phía máy chủ để xác định riêng mã hóa ký tự cho mỗi trang được phân phát hoặc mỗi lần gửi biểu mẫu gửi đến. Điều này làm giảm đáng kể sự phức tạp của việc xử lý một trang web hoặc ứng dụng đa ngôn ngữ.

Mã hóa Unicode cũng cho phép nhiều ngôn ngữ được trộn lẫn trên một trang so với bất kỳ lựa chọn mã hóa nào khác.

có cái nhìn về Why UTF-X

+0

Phản hồi trên android hiển thị mã char không đúng. có nghĩa là máy chủ đang sử dụng mã hóa utf để viết phản hồi. Vấn đề là trong chức năng khách hàng để đọc dữ liệu. Dữ liệu được đọc không được giải mã trở lại bằng utf. Nếu bạn chỉ xem mã –

Các vấn đề liên quan