0

Apache File Upload でファイルを保存しようとしています。私のJSPは以下のようになります

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit"value="upload" />
</form>

私のサーブレットでは、以下のようにアップロードされたファイルを取得できます。

FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mime,fileName);
boolean lock = true;
byte[] b1 = new byte[BUFFER_SIZE];
int readBytes1 = is.read(b1, 0, BUFFER_SIZE);
while (readBytes1 != -1) {
writeChannel.write(ByteBuffer.wrap(b1, 0, BUFFER_SIZE));}
writeChannel.closeFinally();

以下のコードを使用して、ファイルを blob 値として保存しようとしています。

 String blobKey = fileService.getBlobKey(file).getKeyString();
 Entity Input = new Entity("Input");
 Input.setProperty("Input File", blobKey);
 datastore.put(Input);

これを試すと、ファイル名の blob キーを保存できますが、ファイルは保存されません。Google App エンジンの Blob ビューアーと Blob リストに「0」バイトが表示されます。

この問題を解決するためのアイデアを教えてください。

あなたの助けに感謝します。

私のサーブレット

public class UploadServlet extends HttpServlet{
  private static final long serialVersionUID = 1L;
  private static int BUFFER_SIZE =1024 * 1024* 10;
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
   ServletFileUpload upload = new ServletFileUpload();
   FileItemIterator iter; 
try {
iter = upload.getItemIterator(req);
 while (iter.hasNext()) {
   FileItemStream item = iter.next();
   String fileName = item.getName();
   String mime = item.getContentType();

   InputStream is = new BufferedInputStream(item.openStream());
    try {
         boolean isMultipart = ServletFileUpload.isMultipartContent(req);
         if( !isMultipart ) {
             resp.getWriter().println("File cannot be uploaded !");}
         else {
            FileService fileService = FileServiceFactory.getFileService();
            AppEngineFile file = fileService.createNewBlobFile(mime,fileName);
            boolean lock = true;
            FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
            byte[] b1 = new byte[BUFFER_SIZE];
            int readBytes1;
             while ((readBytes1 = is.read(b1)) != -1) {
               writeChannel.write(ByteBuffer.wrap(b1, 0, readBytes1));}
               writeChannel.closeFinally();
            String blobKey = fileService.getBlobKey(file).getKeyString();
            Entity Input = new Entity("Input");
           Input.setProperty("Input File", blobKey);
           datastore.put(Input);}}
catch (Exception e) {
       e.printStackTrace(resp.getWriter());}
  }
}
4

1 に答える 1

3

入力ストリームから間違った方法でデータを読み取っています。そのはず:

byte[] b1 = new byte[BUFFER_SIZE];
int readBytes1;
while ((readBytes1 = is.read(b1)) != -1) {
        writeChannel.write(ByteBuffer.wrap(b1, 0, readBytes));
}
writeChannel.closeFinally();

更新:マルチパートを正しく処理していません。複数のパートがあるため、正しいパート (「ファイル」という名前のパート) を読み取る必要があります。

public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int BUFFER_SIZE = 1024 * 1024 * 10;

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    ServletFileUpload upload = new ServletFileUpload();

    boolean isMultipart = ServletFileUpload.isMultipartContent(req);
    if (!isMultipart) {
        resp.getWriter().println("File cannot be uploaded !");
        return;
    }

    FileItemIterator iter;
    try {
        iter = upload.getItemIterator(req);
        while (iter.hasNext()) {
            FileItemStream item = iter.next();
            String fileName = item.getName();
            String fieldName = item.getFieldName();
            String mime = item.getContentType();

            if (fieldName.equals("file")) {  // the name of input field in html
                InputStream is = item.openStream();
                try {
                    FileService fileService = FileServiceFactory.getFileService();
                    AppEngineFile file = fileService.createNewBlobFile(mime, fileName);
                    boolean lock = true;
                    FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
                    byte[] b1 = new byte[BUFFER_SIZE];
                    int readBytes1;
                    while ((readBytes1 = is.read(b1)) != -1) {
                        writeChannel.write(ByteBuffer.wrap(b1, 0, readBytes1));
                    }
                    writeChannel.closeFinally();
                    String blobKey = fileService.getBlobKey(file).getKeyString();
                    Entity input = new Entity("Input");
                    input.setProperty("Input File", blobKey);
                    datastore.put(input);
                } catch (Exception e) {
                    e.printStackTrace(resp.getWriter());
                }
            }
        }
    } catch (FileUploadException e) {
        // log error here
    }
}
}
于 2013-01-03T07:18:57.573 に答える