2017-11-29 2 views
0

ファイルのアップロードを処理するnode.jsスクリプトがあります。写真や音声をアップロードするだけでうまくいきます。ただし、約10 MB以上のビデオファイルはアップロードされません。場合によっては全く機能しない場合があり、時にはfs.writeFile機能で停止することがあります。おそらく私は自分自身でコードの多くの部分を思いついたので、より良い一般的な方法があります。ディスク上にファイルを作成する前に、そのパスがハッシュから生成されるため、md5ハッシュが必要です。また、私はAndroid側でSocketTimeoutExceptionを取得します。コードは主にその部分に集中しているので、入力の検証やonProgressの不足について心配しないでください。node.jsで大きなファイルのアップロードが失敗するHapi

NodeJS:あなたの助けを

public static void uploadAttachments(ArrayList<EventAttachment> attachments) 
{ 

    OkHttpClient client = new OkHttpClient(); 
    // Add attachments 
    MultipartBody.Builder builder = new MultipartBody.Builder(); 
    builder.setType(MultipartBody.FORM); 
    builder.addFormDataPart("numOfFiles",String.valueOf(attachments.size())); 

    for (int i = 0; i < attachments.size();++i) { 
     EventAttachment attachment = attachments.get(i); 
     File file = new File(attachment.getPath()); 
     String extension = MimeTypeMap.getFileExtensionFromUrl(attachment.getPath()); 
     String type = null; 
     if (extension != null) { 
      type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
     } else { 

      Log.e("x", "Could not get extensions of file " + file.getAbsolutePath() + ". File upload aborted."); 
      return; 
     } 

     ProgressRequestBody p = new ProgressRequestBody(RequestBody.create(MediaType.parse(type), file), new ProgressRequestBody.Listener() { 
      @Override 
      public void onProgress(int progress) { 

      } 
     }); 

     builder.addFormDataPart("file" + i, file.getName(), p); 
     HashMap<String, String> hm = new HashMap<>(); 
     hm.put("extension", extension.replace(".", "")); 
     hm.put("fileType", String.valueOf(attachment.getType())); 
     builder.addFormDataPart("fileMeta" + i, new JSONObject(hm).toString()); 


    } 
    JSONObject jObj = new JSONObject(); 
     builder.addFormDataPart("auth", putDefaultHeader(jObj).toString()); 
     MultipartBody mb = builder.build(); 


     okhttp3.Request request = new Request.Builder().url(EndPoint+UPLOAD_FILE).post(mb).build(); 


     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 

       Log.e("x", "Error uploading file"); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 

      } 
     }); 





} 

ありがとう:

server.route({ 
method: 'POST', 
path: '/uploadFile', 
config: { 
    payload: { 
     output: 'stream', 
     allow: 'multipart/form-data', 
     maxBytes: 100*1024*1024 //100 mb 

    } 
}, handler: async function (request, reply) 
{ 
    await incoming_uploadFile(request, reply); 
} 
}); 

........... 

var joi = require('joi'); 
import { Paths } from "../util/Paths"; 
import * as fs from 'fs'; 

let data; 
let numOfFiles: number; 

export async function incoming_uploadFile(request, reply) { 

data = request.payload; 
await Application.InitializeSocket(null, "UploadFile"); 
let userID = await Application.AuthUser(JSON.parse(data['auth'])); 


numOfFiles = parseInt(data['numOfFiles']); 


if (numOfFiles > 0) 
    upload(0); 

} 

async function upload(i: number) 
{ 


    const file = data['file' + i]; 
    const meta = data['fileMeta' + i]; 
    const metaJson = Application.StringToJson(meta); 

    const fileType: string = metaJson['fileType']; 
    const extension: string = metaJson['extension']; 
    var crypto = require('crypto'); 

    const md5 = crypto.createHash('md5'); 

    var length = parseInt(file.hapi.headers["content-length"]); 

    let buffer: Buffer = new Buffer(length); 
    let bufPos : number = 0; 
    file.on('data', function (b : Uint8Array) { 
     for (var i = 0; i < b.byteLength; ++i) 
      buffer.writeUInt8(b[i], bufPos++); 

    }); 

    file.on('end', function (err) { 

     var hash = md5.update(buffer.toString("base64")).digest("hex"); 
     const filePath: string = Paths.getFilePath(hash, fileType, extension); 

     // Creates all dirs that are missing on the path 
     var shell = require('shelljs'); 
     shell.mkdir('-p', require('path').dirname(filePath)); 

     console.log("writing buffer to file..."); 

     fs.writeFile(filePath, buffer,null); 

     if ((++i) < numOfFiles) 
      upload(i); 




    }); 

} 

Androidのファイルをアップロードします。設定ペイロードと今の作品に

答えて

0

追加

timeout: false, parse: true

関連する問題